# 合并两个有序数组
# 一、题目描述
给你两个有序整数数组 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
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23