这道题使用三指针法,实际上是创建三个变量模拟下标的走势:
一般常规想法是先合并再排序,三指针则是边合并边排序;
l1是nums1的有效数据的最后一位的下标,即m - 1;
l2是num2的有效数据的最后一位的下标,即n - 1;
l是两个合并后有效数据的最后一位的下标,即m + n - 1;
要从nums1后面开始合并,从前面开始合并可能会覆盖掉数据,将l1和l2当前下标的值进行比较,大的排到l指向的位置,并且相应下标和l两个都要减一,直到nums2的元素全部合并到nums1为止。
为什么可以这么做?因为l1,l2,l都只在相应位置停留一次,所以不会出现数据重复或者缺少的情况。
这里可能会有两个情况:
1.l2先小于0,则已经将nums2的元素合并完了;
2.l1先小于0,则nums2的元素还没有合并完,且剩下的nums2元素均小于后面需要排入nums1位置的值,所以直接将nums2有序排入即可。
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) {
int l = m + n - 1;
int l1 = m - 1;
int l2 = n - 1;
while(l2 >= 0 && l1 >= 0)
{
if(nums2[l2] > nums1[l1])
{
nums1[l--] = nums2[l2--];
}
else
{
nums1[l--] = nums1[l1--];
}
}
while(l2 >= 0)
{
nums1[l--] = nums2[l2--];
}
}