BM87 合并两个有序的数组
给你两个有序整数数组 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]
提示:
-10^9 <= nums1[i], nums2[i] <= 10^9
nums1.length == m + n
nums2.length == n
解题思路:
双指针 / 从后往前
最直接的算法实现是将指针p1
置为 nums1
的结尾, p2
为 nums2
的结尾,在每一步将最大值放入输出数组末尾中。
Python代码:
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, p2, p = m-1, n-1, len(nums1)-1
while p1>=0 and p2>=0:
if nums1[p1] >= nums2[p2]:
nums1[p] = nums1[p1]
p1 -= 1
else:
nums1[p] = nums2[p2]
p2 -= 1
p -= 1
nums1[:p2 + 1] = nums2[:p2 + 1]
两个指针必须要置0才能说明遍历了两个数组的所有内容,前面的while循环有可能是从p1条件退出,此时p2还没遍历完,所以此时对应的情况是p1中最小的数比p2当前的数大,所以最后一句将p2中剩余的数一次性拷贝到nums1的头部。