合并两个有序数组(三指针法)

合并两个有序数组(三指针法)_第1张图片

合并两个有序数组(三指针法)_第2张图片 

这道题使用三指针法,实际上是创建三个变量模拟下标的走势:

一般常规想法是先合并再排序,三指针则是边合并边排序;

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--];
    }

}

你可能感兴趣的:(算法,数据结构,c++,c语言,开发语言,算法)