合并两个有序数组


题目来源:https://leetcode-cn.com/problems/merge-sorted-array/

题目


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

说明:

初始化 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]

解题思路


  1. 采用双指针的方法,从后面往前遍历
  2. 定义 p1 指针指向 num1 数字末尾,p2 指向 num2 数字末尾,p 指向 num1 的最末尾;
  3. 从后往前循环遍历比较两个数组之间元素的大小;
  4. p < 0 时,也就是 p1p2 其中一个小于 0,遍历结束;
  5. 若是 num2 数组有剩余部分,因为数组都是有序的,直接将 num2 数组剩余部分放到 num1 数组对应的位置。

代码实现


class Solution:
    def merge(self, nums1, m: int, nums2, n: int) -> None:
        """
        Do not return anything, modify nums1 in-place instead.
        
        合并两个有序数组为一个有序数组

        Args:
            num1: 有序数组 1
            m: num1 的元素数量
            num2: 有序数组 2
            n:num2 的元素数量
        
        Returns:
            返回合并后的有序数组
        """
        # 通过双指针的方法,从后向前遍历的方法、
        # 定义指针 p1 指向 num1 的数字末尾
        # 定义指针 p2 指向 num2 的数字末尾
        # 定义指针 p 指向 num1 的最末尾
        p1 = m - 1
        p2 = n - 1
        p = m + n - 1
        # 当 p 小于 0,即是 p1 和 p2 其中一个小于 0,遍历结束
        while p1 >= 0 and p2 >= 0:
            if nums1[p1] < nums2[p2]:
                nums1[p] = nums2[p2]
                p2 -= 1
            else:
                nums1[p] = nums1[p1]
                p1 -= 1
            p -= 1
        # 两个数组都是有序的
        # 若是 p1 先小于 0,将 num2 剩余部分放在 num1 数组前面
        nums1[:p2 + 1] = nums2[:p2 + 1]

实现效果


merge_result.jpg


以上就是本篇的主要内容

欢迎关注微信公众号《书所集录》

大梦三千秋
41 声望5 粉丝

为而不争