Javascript算法:合并两个有序数组

80 阅读1分钟

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

为了解决这个问题,我们可以使用双指针技术。由于nums1nums2都是有序的,我们可以从每个数组的末尾开始,并使用另一个指针从nums1的末尾开始来填充元素。

以下是具体步骤:

  1. 初始化三个指针 p1, p2p
  2. p1 指向 nums1 的实际元素的末尾。
  3. p2 指向 nums2 的末尾。
  4. p 指向 nums1 的末尾。
  5. 比较 nums1[p1]nums2[p2] 的值,将较大的值放在 nums1[p] 的位置。
  6. 移动相应的指针。
  7. 重复步骤5-6,直到 p2 小于0。

下面是实现这一逻辑的代码:

function merge(nums1, m, nums2, n) {
    let p1 = m - 1;
    let p2 = n - 1;
    let p = m + n - 1;

    while (p2 >= 0) {
        if (p1 >= 0 && nums1[p1] > nums2[p2]) {
            nums1[p] = nums1[p1];
            p1--;
        } else {
            nums1[p] = nums2[p2];
            p2--;
        }
        p--;
    }
}

// 例子
let nums1 = [1, 2, 3, 0, 0, 0];
let m = 3;
let nums2 = [2, 5, 6];
let n = 3;

merge(nums1, m, nums2, n);
console.log(nums1);  // [1,2,2,3,5,6]

需要注意的是,函数参数中的 mn 分别表示 nums1nums2 的实际元素数量。nums1 的长度至少为 m + n,并且其后面的位置用于存储 nums2 的元素。