原题链接

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

说明:

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

解法一

直接在不超过数组空间的情况下合并两个数组(splice),再进行排序。

var merge = function (nums1, m, nums2, n) {
nums1.splice(m, n, ...nums2);
nums1.sort((a, b) => a - b);
};

解法二

设置指针 len1 和 len2 分别指向 nums1 和 nums2 的有数字尾部,从尾部值开始比较遍历,同时设置指针 len 指向 nums1 的最末尾,每次遍历比较值大小之后,则进行填充。

当 len2 先小于 0 时,此时 num2 已全部填充进 nums1 中,则已经得到目标结果。 若 len1 先小于 0 时,表明此时 nums2 中 len2 之前的值都比 nums1 中的元素小,替换掉 nums1 中长度为 len2 + 1 的元素即可。

var merge = function (nums1, m, nums2, n) {
let len1 = m - 1;
let len2 = n - 1;
let len = m + n - 1;
while (len1 >= 0 && len2 >= 0) {
nums1[len--] = nums1[len1] > nums2[len2] ? nums1[len1--] : nums2[len2--];
}

if (len1 < 0) {
nums1.splice(0, len2 + 1, ...nums2.slice(0, len2 + 1));
}
};