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

发布时间:2024年01月21日

?

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

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

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

}

文章来源:https://blog.csdn.net/cookies_s_/article/details/135730585
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。