# 合并两个有序数组

# 一、题目描述

给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。 初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。你可以假设 nums1 的空间大小等于 m + n,这样它就有足够的空间保存来自 nums2 的元素。

示例 1: 输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3 输出:[1,2,2,3,5,6]

示例 2: 输入:nums1 = [1], m = 1, nums2 = [], n = 0 输出:[1]

# 二、解题思路

1、暴力法

/**
 * @param {number[]} nums1
 * @param {number} m
 * @param {number[]} nums2
 * @param {number} n
 * @return {void} Do not return anything, modify nums1 in-place instead.
 */
var merge = function(nums1, m, nums2, n) {
    nums1.splice(m, n, ...nums2);
    nums1.sort((a,b) => a - b);
};
1
2
3
4
5
6
7
8
9
10
11

2、反向双指针

思路:比较num2尾部和num1有效数字的尾部,取较大的值覆盖掉num1的尾部,n次之后,num1的尾部n个空位被填满,即num2被合并到了num1中。

/**
 * @param {number[]} nums1
 * @param {number} m
 * @param {number[]} nums2
 * @param {number} n
 * @return {void} Do not return anything, modify nums1 in-place instead.
 */
var merge = function(nums1, m, nums2, n) {
    let p1 = m - 1; // p1指针指向num1有效位的末尾
    let p2 = n - 1; // p2指针指向num2的末尾
    let p = m + n - 1; // p指针指向nums1的末尾

    if (m === 0) { // num1无有效内容,直接将num2复制到num1中
        for (let i = 0; i < n; i++) {
            nums1[i] = nums2[i];
        }
    } else {
        while(p2 >= 0) { // 比较num2尾部和num1有效数字的尾部,取较大的值覆盖掉num1的尾部
            nums1[p--] = nums1[p1] >= nums2[p2] ? nums1[p1--] : nums2[p2--];
        }
    }
};

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
上次更新: 1/5/2022, 9:25:14 AM