LeetCode0088. 合并两个有序数组

一. 题目
  1. 题目
    在这里插入图片描述
  2. 示例
    在这里插入图片描述
二. 方法一
  1. 解题思路

    1. 为每个列表定义一个指针l1, l2, 用于后续元素的比较
    2. 如果 l1指向的元素小于l2指向的元素, 则l1向后移动一位
    3. 如果 l1指向的元素大于等于l2指向的元素, 则将l2指向的元素插入到l1所指的位置
    4. 将l2向后移动一位, nums1中元素个数(m) + 1; 并且弹出num1中最后一个元素, 如果不弹出, list1的长度将改变
    5. 当l1的指向了nums1的最后一个元素时, 此时nums2中剩下的元素都比num1中的元素大
    6. 只需要将num2剩余的元素依次插入到nums1元素的后面即可.
    7. 此时仍然需要执行操作4
    8. 遍历完后就OK了
  2. 解题代码

    def merge( nums1: List[int], m: int, nums2: List[int], n: int):
    	# 为每个列表定义一个指针l1, l2, 用于后续元素的比较
        l1, l2 = 0, 0
        while l2 < n:
        	#  如果 l1指向的元素小于l2指向的元素, 则l1向后移动一位
            while nums1[l1] < nums2[l2] and l1 < m:
                l1 += 1
            # 如果l1指向的元素大于等于l2指向的元素, 则将l2指向的元素插入到l1所指的位置
            # 如果l1的指向了nums1的最后一个元素时, 则将l2剩余的元素插入到l1所指的位置
            if nums1[l1] >= nums2[l2] or nums1[m - 1] <= nums2[l2]:
                nums1.insert(l1, nums2[l2])
                # nums2的指针向后移动
                l2 += 1
                # 修改nums元素个数
                m += 1
                # 添加一个元素, 就弹出一个元素, 确保nums1的长度不变
                # 因为没有返回值, 所以只能通过这样控制
                nums1.pop()
    
  3. 分析
    时间复杂度: O(n)
    空间复杂度: O(1)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值