You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

LeetCode86合并有序数组JS实现求助:m=0时返回[0]异常

解决LeetCode合并有序数组原地修改的问题

你的问题出在JavaScript数组的赋值逻辑和对「原地修改」的理解上:当你写nums1 = [...nums2]时,只是给局部变量nums1重新赋值了一个新数组,而LeetCode判题系统检查的是最初传入的那个原数组的内存内容,所以这个操作完全不会改变原数组,自然返回的还是初始的[0]。

要实现原地修改,必须直接通过索引修改原数组的元素,而不是重新赋值变量。下面给出针对性处理和通用最优解法:

1. 针对性处理m=0的情况

当m=0时,nums1没有有效元素,直接把nums2的元素逐个覆盖到nums1的对应位置即可:

function merge(nums1, m, nums2, n) {
    if (m === 0) {
        for (let i = 0; i < n; i++) {
            nums1[i] = nums2[i];
        }
        return;
    }
    // 其他情况的逻辑...
}

2. 通用最优解法(双指针从后往前)

这是题目推荐的高效解法,利用nums1末尾的n个占位0,从后往前填充元素,避免覆盖未处理的有效元素,时间复杂度O(m+n),空间复杂度O(1):

function merge(nums1, m, nums2, n) {
    let p1 = m - 1; // nums1有效元素的最后索引
    let p2 = n - 1; // nums2有效元素的最后索引
    let p = m + n - 1; // 合并后数组的最后索引

    // 从后往前比较,把较大的元素放到nums1末尾
    while (p1 >= 0 && p2 >= 0) {
        nums1[p--] = nums1[p1] > nums2[p2] ? nums1[p1--] : nums2[p2--];
    }

    // 如果nums2还有剩余元素,全部拷贝到nums1前面(此时nums1的有效元素已处理完)
    while (p2 >= 0) {
        nums1[p--] = nums2[p2--];
    }
}

这个解法会自动处理m=0的情况:当m=0时,第一个循环不会执行,直接进入第二个循环把nums2的所有元素覆盖到nums1中,正好解决你遇到的nums1=[0],m=0,nums2=[1],n=1测试用例。

关键总结

  • 「原地修改」要求直接修改传入的原数组,不能通过重新赋值变量的方式替换数组。
  • 从后往前的双指针法是本题的最优解,既满足原地修改,又保证了时间效率。

内容的提问来源于stack exchange,提问作者Pravin Poudel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 05:10:17