一、逆序双指针
- 因为要将nums2的元素插入nums1,如果按顺序插入就有可能覆盖掉nums1的元素,因此采用逆序的方式插入。
- 创建两个指针p1和p2,分别指向nums1和nums2需要合并数组的末尾。
- 创建一个指针a指向nums1的末尾,比较nums1[p1]和nums2[p2]的大小,把较大的数存入nums1[a],然后a–,nums1[p1]和nums2[p2]中较大元素的指针减一。
二、视频介绍
88. 合并两个有序数组
三、代码
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
int a = nums1.size() - 1;
int p1 = m - 1; //指向nums1需要合并数组的末尾
int p2 = n - 1; //指向nums2需要合并数组的末尾
while (a >= 0)
{
if (p1 == -1)
{
nums1[a--] = nums2[p2--]; //如果nums1需要合并的数组已经完成合并,就把nums2剩余需要合并的数组都赋给nums1
}
else if (p2 == -1)
{
nums1[a--] = nums1[p1--];//如果nums2需要合并的数组已经完成合并,就把nums1剩余需要合并的数组都赋给nums1
}
else
{
nums1[a--] = nums1[p1] >= nums2[p2] ? nums1[p1--] : nums2[p2--]; //将nums1[p1]和nums2[p2]中较大的赋给nums1[a],较大的元素的指针指向前一个元素,同时a也指向前一个元素
}
}
}
};