题目:
给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。
初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。你可以假设 nums1 的空间大小等于 m + n,这样它就有足够的空间保存来自 nums2 的元素。
示例:
输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3
输出:[1,2,2,3,5,6]
思路:
想象两列大小不一的货物按照大小顺序摆放,然后现在要合并起来,还要按顺序摆放,如果我们把两个数组合并后,再比较大小,时间复杂度高,如果移动到第三个货架上去比较排列,时间和空间复杂度都高。
这里使用双指针,从后往前比较放入第一个列表中,设置三个初始指针分别指向合并后的数组和两个原始数组的最后一位,进入循环,如果第一个数组的末尾值大,就放进结果数组中,第一个数组指针前移一位,结果数组的指针前移一位,因为放了一个数了,如果第一个数组的末尾值小,就放第二个数组的末尾数,就是从后往前放置,放大的。
注意,到某个数组遍历完,跳出循环后,如果第二个数组的指针大于等于0,说明没有遍历完,前面多是第一个数组中的数大,第二个中的小,所以就按照结果数组指针索引将第二个数组中没放进的数放到前面即可。
为啥不判断第一个数组的指针是否大于0呢,因为如果它大于0,说明是第二个数组的数大,被放到了结果数组后,前面的小,也就不用动了。
class Solution(object):
def merge(self, nums1, m, nums2, n):
"""
:type nums1: List[int]
:type m: int
:type nums2: List[int]
:type n: int
:rtype: None Do not return anything, modify nums1 in-place instead.
"""
#合并后比较,时间复杂度高
#双指针,移动到第三个货架上,时间和空间复杂度都高
#双指针,从后向前比较
end = m + n -1
m -= 1
n -= 1
#每个数组的最后一位
#当某个数组指针为-1,结束循环
while end >= 0 and m >= 0 and n >= 0:
if nums1[m]> nums2[n]:
nums1[end] = nums1[m]
m -= 1
else:
nums1[end]= nums2[n]
n -= 1
end = end -1
#当数组1都移动到后面,说明数组1的数大,数组2的指针没机会移动,
#m=-1跳出循环,n>=0,可直接将数组2的数放到前面
while n >= 0:
nums1[end] = nums2[n]
n -= 1
end -= 1#记得改变指向原长数组的指针