【LeetCode12】合并两个有序数组

640?wx_fmt=png

? 温故而知新

? 今日挑战

给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组。

说明:

初始化 nums1 和 nums2 的元素数量分别为 m 和 n。你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。

示例:

输入:nums1 = [1,2,3,0,0,0], m = 3nums2 = [2,5,6],       n = 3

输出: [1,2,2,3,5,6]

先思考一下,后面我会给出一个解题思路~?

640?wx_fmt=other

图来自网络

我发现最近做的题目都可以用双指针算法来解决,这道题也一样,我们定义两个指针p1和p2,分别从数组1指定位置(由m决定)和数组2的尾端开始往前遍历。

1 )因为题目说明了,nums1有足够的空间去保存所有nums1和nums2的元素,所以我们假设nums1的空间为m+n

2 )定义一个中间指针p,p从nums1的末端开始往前移动

3 )当nums1[p1]>nums2[p2]的时候,nums1[p]赋值为nums1[p1],否则nums1[p]赋值为nums1[p2],并且,对应的指针(p1或p2)需要往前移动一位,p也移动一位

4 )直到任一指针(p1或p2)移动到了头部(即p1 or p2 小于0),停止迭代

5 )但是这存在一个问题,那就是nums1提前结束,所以nums1的前部分可能有部分元素没有被更新,需要进一步把没有迭代的nums2元素赋值给nums1,这一句话可能有点绕,大家可以看下我大概画的示意图:

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png

Python实现:

def merge(nums1, m, nums2, n):
    p1,p2,p = m-1,n-1,m+n-1
    while (p1>=0) and (p2>=0):
        if nums1[p1]>nums2[p2]:
            nums1[p] = nums1[p1]
            p1-=1
        else:
            nums1[p] = nums2[p2]
            p2-=1
        p-=1
    for k in range(p2,-1,-1):
        nums1[k]=nums2[k]
    return nums1

? 配图角色背景介绍

行骗为生的斯科特·朗(保罗·路德饰),在偷了生化学家汉克·皮姆博士(迈克尔·道格拉斯饰)发明的蚁人战服后,拥有了自由收缩身体大小的超能力。汉克·皮姆博士开发出一种“皮姆粒子”,并和斯科特·朗一同成为“蚁人”。斯科特也不得不接受自己的英雄身份,并帮助皮姆博士守护蚁人技术之谜。在强大的敌人威胁下,两人必须精心策划并执行一场惊天骗局来拯救世界维护和平。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值