LeetCode刷题之路:88. 合并两个有序数组

如果帮助到您,还请点个关注吧,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

猜你喜欢

转载自blog.csdn.net/as812252319/article/details/112184765