classSolution: defmerge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None: """ Do not return anything, modify nums1 in-place instead. """ defgoBack(index): for i inrange(len(nums1) - 1, index, -1): nums1[i] = nums1[i-1]
# if m == 0: return nums2 # nums1为空 这是一个原地算法,所以不能返回,只能修改nums1 if m == 0: nums1[:] = nums2[:] return if n == 0and m != 0: nums1 = nums1[:m+1] # nums2为空 return if m == 0and m == 0: nums1 = [] return i = j = 0 while m < len(nums1): if nums1[i] < nums2[j]: while nums1[i] < nums2[j] and i < m: i += 1 goBack(i) nums1[i] = nums2[j] i += 1 j += 1 m += 1# 每插入一个数 m就要加一
classSolution(object): defmerge(self, nums1, m, nums2, n): """ :type nums1: List[int] :type m: int :type nums2: List[int] :type n: int :rtype: void Do not return anything, modify nums1 in-place instead. """ # Make a copy of nums1. nums1_copy = nums1[:m] nums1[:] = []
# Two get pointers for nums1_copy and nums2. p1 = 0 p2 = 0
# Compare elements from nums1_copy and nums2 # and add the smallest one into nums1. 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 there are still elements to add if p1 < m: nums1[p1 + p2:] = nums1_copy[p1:] if p2 < n: nums1[p1 + p2:] = nums2[p2:]
classSolution(object): defmerge(self, nums1, m, nums2, n): """ :type nums1: List[int] :type m: int :type nums2: List[int] :type n: int :rtype: void Do not return anything, modify nums1 in-place instead. """ # two get pointers for nums1 and nums2 p1 = m - 1 p2 = n - 1 # set pointer for nums1 p = m + n - 1
# while there are still elements to compare while p1 >= 0and p2 >= 0: if nums1[p1] < nums2[p2]: nums1[p] = nums2[p2] p2 -= 1 else: nums1[p] = nums1[p1] p1 -= 1 p -= 1
# add missing elements from nums2 nums1[:p2 + 1] = nums2[:p2 + 1]