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

合并两个有序数组到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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 03:57:00