每日一题88-合并两个有序数组(理解双指针思想)

1.题目详情

给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。

初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。你可以假设 nums1 的空间大小等于 m + n,这样它就有足够的空间保存来自 nums2 的元素。
在这里插入图片描述

2.解题思路

不要偷懒,直接俩列表相加再排序!(虽然也可以哈哈哈)
用双指针的思想

根据题意,有两个列表,并分别给你每个列表的元素个数,因此首先要明确列表多余给定个数后边的需抹去,所以可以copy一个去掉m后多余元素的 num1,再将num1清空,接下来是双指针思想了!!

  1. 定义两个指针从0开始,分别指向nums1_copy和nums2的头部,选出指向这两个指针的元素的最小值,并将其添加到num1中(因为题目最后要返回num1)。
  2. 两个指针中指向最小元素的真正后移一位,新指针指向的元素再与原来在刚才比较时略大的那个元素进行比较,再选出最小值,并将其添加到num1中。
  3. 重复上述比较最小值的操作,直至指针指向某个列表末尾,结束循环。
  4. 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.知识点

理解双指针指向问题

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值