1.题目详情
给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。
初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。你可以假设 nums1 的空间大小等于 m + n,这样它就有足够的空间保存来自 nums2 的元素。
2.解题思路
不要偷懒,直接俩列表相加再排序!(虽然也可以哈哈哈)
用双指针的思想
根据题意,有两个列表,并分别给你每个列表的元素个数,因此首先要明确列表多余给定个数后边的需抹去,所以可以copy一个去掉m后多余元素的 num1,再将num1清空,接下来是双指针思想了!!
- 定义两个指针从0开始,分别指向nums1_copy和nums2的头部,选出指向这两个指针的元素的最小值,并将其添加到num1中(因为题目最后要返回num1)。
- 两个指针中指向最小元素的真正后移一位,新指针指向的元素再与原来在刚才比较时略大的那个元素进行比较,再选出最小值,并将其添加到num1中。
- 重复上述比较最小值的操作,直至指针指向某个列表末尾,结束循环。
- num1新列表中已经有两个列表排序好的一部分数了,但是还有一部分!就是在第三步中指针不是指向某个列表末尾了嘛,那么另一个列表还多出一部分元素没人管呢!,所以最后一步就是将这个列表多出来的元素加到nums1中。over!!
3.代码实现
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.
"""
left = 0
right = 0
nums1_copy = nums1[:m] #去掉m长度后的元素
nums1[:] = []
while left < m and right < n:
if nums1_copy[left] < nums2[right]:
nums1.append(nums1_copy[left]) #把小的数放在空的num1列表中
left += 1 #指针后移一位
else: #同理
nums1.append(nums2[right])
right += 1
#处理指针未指到头的列表中多出来的元素
if left < m:
#从nums1的尾部开始添加,而nums1的尾部就是两个指针相加的结果。
nums1[left+right:] = nums1_copy[left:] #循环中指针没走到头的那个位置开始往后加
if right < n:
nums1[left+right:] = nums2[right:]
4.知识点
理解双指针指向问题