如果帮助到您,还请点个关注吧,hahaha
给你两个有序整数数组 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
#最直观的思路
设l1/l2分别代表两个列表当前所遍历到的位置
insert表示已经插入成功的数字个数
首先判断n是否为0,如果为0,则不需要修改nums1,直接跳过即可
若m为0,则直接将nums2的值全部赋予给nums1
(注意这里使用nums1[:]而不是nums1
我们需要辨析:nums1 = A 和 nums1[:] = A 的不同之处:
nums1 = A # 更改 nums1 这一变量名所指向的对象。让 nums1 变量指向 A 所指向的对象
nums1[:] = A # 对 nums1 指向的对象赋值。把 A 变量指向的对象的值逐个 copy 到 nums1 指向的对象中并覆盖 nums1 指向的对象的原来值。
详情可以查看:https://leetcode-cn.com/problems/merge-sorted-array/solution/gelthin-gui-bing-pai-xu-by-gelthin/
若m和n都不为0,则开始进行遍历两个列表
第一句判断 nums2[l2]是否小于等于nums1[l1],同时l1是否小于m + insert,
若满足,则将nums2[l2]插入到nums1[l1]的位置。同时l1/l2/insert都自加1
若不满足,则只有l1自加1。(这代表当前nums1[l1]位置的数小于nums2[l2])
l1 >= m + insert 这句话是判断nums1中的数字是否已经遍历完毕,
如果nums1已经遍历完毕,但是nums2中的数字却没有遍历完毕,
则需要直接将nums2中没遍历过的数字直接插入到nums1中即可。
最后一步是提出原来nums1末尾的0
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.
"""
l1 = 0
l2 = 0
insert = 0
if n == 0:
pass
elif m == 0:
nums1[:] = nums2
else:
while l2 < len(nums2):
if nums2[l2] <= nums1[l1] and l1 < m + insert:
nums1.insert(l1, nums2[l2])
l2 += 1
l1 += 1
insert += 1
else:
l1 += 1
if l1 >= m + insert:
nums1.insert(l1, nums2[l2])
l2 += 1
# print (nums1)
nums1[:] = nums1[:len(nums1) - n]
return nums1