题面

给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 使得 num1 成为一个有序数组。

样例

1. 输入:
nums1 = [1,2,3,0,0,0], m = 3
nums2 = [2,5,6], n = 3 输出: [1,2,2,3,5,6] 2. 输入:
nums1 = [0], m = 0
nums2 = [6], n = 1 输出: [6]

算法

时间复杂度:O(n+m)

与合并有序链表类似。

1. 如果m为0,直接返回就可以了。如果n为0,则需要把nums2中前n个元素都搬到nums1中,返回。

2. 如果,m、n都不为0,计算合并后的元素数len = m+n, 我们从后往前为nums1[len--]赋max(nums1[m]nums2[n]), 之后较大的数组下标自减(已经比较后填入了nums1中),直到某个数组被遍历完。

3. 如果2之后,m == 0,那么代表nums1中的元素都已经填完了,就把nums2中剩下的元素按次序填入nums1中即可;如果 n == 0,即nums2填完了,那就结束,剩下的nums1本来就是有序的。

源码

 class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
if(n == )
return ;
else if(m == )
{
for(int i=; i<n; i++)
nums1[i] = nums2[i];
} //从往前放置
int len = m+n-;
m--; n--;
while(m >= && n >= && len >= )
{
if(nums1[m] < nums2[n])
{
nums1[len] = nums2[n];
len--; n--;
}
else
{
nums1[len] = nums1[m];
len--; m--;
}
}
if(m < )
{
for(int i=; i<=n; i++)
nums1[i] = nums2[i];
}
}
};

最新文章

  1. SDOI 2016 数字配对
  2. gcc的-D和-U参数:宏的设置与取消 _CCFLAGS=&quot; -w -enable-threads=posix -DLINUX -D_REENTRANT -DWORKONGN -Dlinux -D_GN_DETAIL_SDR_&quot;
  3. IOS 的loadView 及使用loadView中初始化View注意的问题。(死循环并不可怕)
  4. Oracle EBS-SQL (SYS-10):锁定表查询.sql
  5. Linux 高性能server编程——高级I/O函数
  6. 1.1 什么是LinQ
  7. QzzmServer v2.0正式版发布
  8. BASH SHELL not a valid identifier
  9. 【Spring系列】自己手写一个 SpringMVC 框架
  10. qt 视频播放器错误解决方法
  11. 深入理解Spring IOC工作原理
  12. Docker最全教程——从理论到实战(七)
  13. NPM,bower的安装目录
  14. 出现 OSError: symbolic link privilege not held的解决方案
  15. 计划任务执行bat
  16. 从匿名函数(闭包特性)到 PHP 设计模式之容器模式
  17. unity pattern not found
  18. 练习vue(用户管理)1
  19. Linux下gcc编译生成动态链接库*.so文件并调用它(注:执行Test程序后无需用export 命令指定.so库文件路径:方法在文中下方;)
  20. fedora修改主目录文件名为英文

热门文章

  1. 在 kubernetes 集群中部署一套 web 网站(网页内容不限)
  2. java写文件实现换行
  3. PAT 甲级 1044 Shopping in Mars (25 分)(滑动窗口,尺取法,也可二分)
  4. (七)Centos之链接命令
  5. Docker 容器的资源限制 cgroup(九)
  6. tab页签
  7. Ie浏览器请求400错误,谷歌火狐等浏览器正常请求.
  8. rebbitMQwindows安装及使用
  9. Python 实现把两个排好序的的列表合并成一个排序列表
  10. Calibre 和 Kindle 配合的使用方法