【双指针算法】88. 合并两个有序数组
题目
解析
举一个例子 nums1 = [1,2,3] nums2 = [2,5,6]
那么首先设置一个指针pos = m + n - 1 (合并之后的数组长度是m + n),之后循环两个数组(循环条件设置成m >= 0 && n >= 0) 从后面依次取出两个数组的元素(这两个数组本身就是非递减有序,为了找出更大的元素放到新的位置),比较大小,每次取出较大的数字放进POS位置,然后pos–, m或者n的位置减一,所以,这样看起来就像是每次将较大的元素当放到数组的最后面 ,到最后合并之后的新数组就是非递减有序。那么nums2没有完全归并完毕怎么办,那么将nums2剩下的元素放到剩下的位置即可
代码
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
int pos = m + n - 1;// 合并之后的数组下标
// 从后面开始 将较大的数字放到数组后面
// nums1 与 nums2 都是非递减的数组 那么从后面开始比较
// 每次就会将较大的数字拿出来
// 1 2 3 0 0 0 2 5 6
m--;
n--; // 数组长度
while(m >= 0 && n >= 0)
{
// 3 与 2 进行比较开始向后移动位置
// 2 最终会移动到3的位置
if(nums1[m] > nums2[n])
{
nums1[pos] = nums1[m];
pos--;
m--;
}
else
{
nums1[pos] = nums2[n];
pos--;
n--;
}
}
// 上面的循环结果 一定是 m < 0 或者n < 0
// m < 0 说明nums1 的数都比nums2 的大 导致nums1全部往后移动了m个单位
// n < 0 说明 nums2 合并完毕! nums2 的数字都比num1大
while(n >= 0)
{
nums1[pos] = nums2[n];
pos--;
n--;
}
}
};