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
相关产品推荐
相关产品推荐

