合并两个有序数组到nums1的Java代码运行错误,如何排查修复?
错误原因
你代码的核心问题是从前往后遍历修改nums1,会覆盖nums1中还未被处理的有效原始值:
以你提供的测试用例为例:
- 初始nums1的有效元素为
[1,2,3],当遍历到索引i=2时,判断逻辑得出nums1[2]=3 > nums2[0]=2,于是将nums1[2]赋值为2,直接把原nums1中还未用到的有效值3覆盖。 - 后续遍历到
i=3时,读取的nums1[k]已经是被覆盖后的2,而非原本的3,最终输出结果就会出现多余的2、丢失3的问题。
修复方案
推荐使用从后往前双指针的写法,利用nums1尾部的闲置空间填充结果,不会覆盖未处理的有效元素:
public void merge(int[] nums1, int m, int[] nums2, int n) { // 指向nums1最后一个有效元素 int p1 = m - 1; // 指向nums2最后一个有效元素 int p2 = n - 1; // 指向nums1当前待填充的位置,从末尾开始 int fillIndex = m + n - 1; // 两个数组都有未处理元素时,取较大值填充 while (p1 >= 0 && p2 >= 0) { if (nums1[p1] > nums2[p2]) { nums1[fillIndex] = nums1[p1]; p1--; } else { nums1[fillIndex] = nums2[p2]; p2--; } fillIndex--; } // 如果nums2还有剩余未处理元素,直接复制到nums1剩余位置 // nums1如果有剩余不需要额外处理,元素本身就已经在nums1对应位置 while (p2 >= 0) { nums1[fillIndex] = nums2[p2]; p2--; fillIndex--; } }
内容的提问来源于stack exchange,提问作者Pratik Patil
相关产品推荐
相关产品推荐

