88. 合并两个有序数组
难度简单878
给你两个有序整数数组
nums1
和nums2
,请你将nums2
合并到nums1
中,使nums1
成为一个有序数组。初始化
nums1
和nums2
的元素数量分别为m
和n
。你可以假设nums1
的空间大小等于m + n
,这样它就有足够的空间保存来自nums2
的元素。示例 1:输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3 输出:[1,2,2,3,5,6]
示例 2:输入:nums1 = [1], m = 1, nums2 = [], n = 0 输出:[1]
逆向双指针
算法
nums1的后半部分是空的,可以直接覆盖而不会影响结果。因此可以指针设置为从后向前遍历,每次取两者之中的较大者放进nums1只需要将nums21中的元素遍历完
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.
"""
f1,f2=m-1,n-1
l=len(nums1)-1
while f2>=0:
if f1<0 or nums1[f1]<=nums2[f2]:
nums1[l] = nums2[f2]
l -= 1
f2 -= 1
else:
nums1[l] = nums1[f1]
l -= 1
f1 -= 1
直接合并后排序
算法
最直观的方法是先将数组 nums 2放进数组nums 1 的尾部,然后直接对整个数组进行排序
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.
"""
for i in range(n):
nums1[m+i]=nums2[i]
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.
"""
sorted = []
p1, p2 = 0, 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(nums1[p1])
p1 += 1
else:
sorted.append(nums2[p2])
p2 += 1
nums1[:] = sorted