算法与数据结构(合并两个有序数组)
题目
![](https://i-blog.csdnimg.cn/direct/e37c82a0aacd4f6dbd86bebcb7eade6d.png)
思路
因为nums1数组的长度的长度等于m+n,所以我们可以采用逆向双指针的方法,分别从nums1的m-1的位置和nums2的n-1的位置向前遍历,选取它们两个之间较大的数分别向nums1的m+n-1的位置开始不断向前插入
解题过程
定义好cur1,cur2和k后,在确保nums1和nums2都没遍历完的情况下选择较大的元素放到k位置,以此循环。
最后若nums2中的元素没有遍历完,则挨个向k位置插入。
如果nums1中的元素没有遍历完,则无需操作,因为nums1中前面的元素是有序的。
代码
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n)
{
int cur1 = m-1,cur2 = n-1;
int k = m+n-1;
while(cur1>=0 && cur2>=0)
{
//选择较大的放到k位置
if(nums1[cur1] < nums2[cur2])
nums1[k--] = nums2[cur2--];
else
nums1[k--] = nums1[cur1--];
}
while(cur2>=0)
{
nums1[k--] = nums2[cur2--];
}
}
};