数据结构之合并两个有序数列

先奉上oj链接:力扣icon-default.png?t=N6B9https://leetcode.cn/problems/merge-sorted-array/

 

 然后我们处理一下这道题。题中给我们的两个数组不是随便给的,是有要求的,第一个数组前面m个元素随便给,但是后面n个元素是0,然后第二个数组就有n个元素,意思是合并数组之后第一个数组后面的n个0就不要了,剩下的元素按照非递减排列。

这道题的思想的话,还是和上一道题移除元素的思想是一样的,都是采用双指针的的想法,分别取两个数组中的有效元素,因为第一个数组后面的元素是0,所以我们要从后往前插入元素,又因为合并之后的数组是非递减的,所以我们要比较有效元素,选大的插入到第一个数组的最后。因为我们需要分别定位两个数组的有效元素,并且还要从后往前插入元素,所以双指针已经不够用了,我们需要三个指针。具体实现过程可以参考下面的代码:

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n)
{
    int* p1 = nums1+m-1;
    int* p2 = nums2+n-1;
    int* end = nums1+m+n-1;
    while((p1-nums1+1)&&(p2-nums2+1))
    {
        if(*p1<*p2)
        {
            *end = *p2;
            p2--;
            end--;
        }
        else
        {
            *end = *p1;
            p1--;
            end--;
        }
    }
}

这里还要判断,如果有一个数组走完了应该怎么处理,如果第二个数组先走完,说明第一个数组还没进行比较的元素一定比第二个数组最小的元素还要小,那我们也不用处理了,直接放在原位就好了,如果第一个数组先走完,那么同理第一个数组中前面的元素我们需要替换成第二个数组中剩下内容。

if(nums1>p1)
{
    while(p2-nums2+1)
    {
        *end = *p2;
        p2--;
        end--;
    }
}

加上这样的处理之后逻辑就已经达成了,只需要把这两段连起来就可以了

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n)
{
    int* p1 = nums1+m-1;
    int* p2 = nums2+n-1;
    int* end = nums1+m+n-1;
    while((p1-nums1+1)&&(p2-nums2+1))
    {
        if(*p1<*p2)
        {
            *end = *p2;
            p2--;
            end--;
        }
        else
        {
            *end = *p1;
            p1--;
            end--;
        }
    }
    if(nums1>p1)
    {
        while(p2-nums2+1)
        {
            *end = *p2;
            p2--;
            end--;
        }
    }
}

这样就大功告成了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值