题意:将排序好的数组nums2合并到nums1中,使得nums1成为一个有序数组。假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。
方法一:双指针方法,从后往前
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
p = n+m-1
while p1>=0 and p2>=0:
if nums1[p1]<nums2[p2]:
nums1[p] = nums2[p2]
p2 -=1
else:
nums1[p] = nums1[p1]
p1 -=1
p -=1
nums1[:p2+1]=nums2[:p2+1]
时间复杂度为O(N+M)
空间复杂度为O(1)
nums1 = A 和 nums1[:] = A 的不同之处:
nums1 = A # 更改 nums1 这一变量名所指向的对象。让 nums1 变量指向 A 所指向的对象,改变了原对象。
nums1[:]=A #只是对nums1所指向的对象赋值,只是值的改变,仍然是原对象。满足原地修改的要求。
方法二:双指针,从前往后
该方法需要先将nums1复制出来nums1_copy,然后以此和nums2进行比较,将小值移入到nums1中。
class Solution:
def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
nums1_copy = nums1[:m]
nums1[:]=[]
p1=p2=0
while p1<m and p2<n:
if nums1_copy[p1]<nums2[p2]:
nums1.append(nums1_copy[p1])
p1 +=1
else:
nums1.append(nums2[p2])
p2 +=1
if p1<m:
nums1[p1+p2:]=nums1_copy[p1:]
if p2<n:
nums1[p1+p2:]=nums2[p2:]
时间复杂度 : O(n+m)
空间复杂度 : O(m)
方法二已经取得了最优的时间复杂度O(n+m),但需要使用额外空间,这是由于在从头改变nums1的值时,需要把nums1中的元素存放在其他位置。