题目
有两个按非递减顺序排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。
请你合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。
示例
输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3
输出:[1,2,2,3,5,6]
解释:需要合并 [1,2,3] 和 [2,5,6] 。
合并结果是 [1,2,2,3,5,6] ,其中斜体加粗标注的为 nums1 中的元素。
解法一
将num2直接加到nums1后,然后sort排序
class Solution:
def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
"""
Do not return anything, modify nums1 in-place instead.
"""
nums1[m:] = nums2
nums1.sort()
时间复杂度:O((m+n)log(m+n))。空间复杂度:O(log(m+n))
解法二
可以使用双指针的方法,每次比较两个数组中最小的加入
class Solution:
def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
"""
Do not return anything, modify nums1 in-place instead.
"""
sorted=[]
p1=0
p2=0
while p1<m or p2<n:
if p1==m:
sorted.append(nums2[p2])
p2+=1
elif p2==n:
sorted.append(nums1[p1])
p1+=1
elif nums1[p1]>nums2[p2]:
sorted.append(nums2[p2])
p2+=1
else:
sorted.append(nums1[p1])
p1+=1
nums1[:]=sorted
时间复杂度:O(m+n)。空间复杂度:O(m+n)
解法三
解法二需要额外的空间来存,不能直接存到num1里,因为会替换掉,如果使用逆向的双指针,可以从后往前存到nums1里。
class Solution:
def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
"""
Do not return anything, modify nums1 in-place instead.
"""
p1=m-1
p2=n-1
i=m+n-1
while p1>-1 or p2>-1:
if p1==-1:
nums1[i]=nums2[p2]
p2-=1
i-=1
elif p2==-1:
nums1[i]=nums1[p1]
p1-=1
i-=1
elif nums1[p1]>nums2[p2]:
nums1[i]=nums1[p1]
p1-=1
i-=1
else:
nums1[i]=nums2[p2]
p2-=1
i-=1