今日挑战
给定两个有序整数数组 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]
先思考一下,后面我会给出一个解题思路~?
图来自网络
我发现最近做的题目都可以用双指针算法来解决,这道题也一样,我们定义两个指针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,这一句话可能有点绕,大家可以看下我大概画的示意图:
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