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

合并k个有序数组的代码输出不符预期,请求问题排查

合并K个有序数组结果不符合预期的问题排查

核心问题:combine函数的索引逻辑完全混乱

你的combine函数中,合并两个有序数组的核心循环部分,索引变量的使用完全搞反了,这是导致结果顺序错误的直接原因:

原错误代码片段:

int i = 0, j = 0, n = 0;
while (i < arr1.len && j < arr2.len) {
    if (arr1.arr[j] > arr2.arr[i]) {
        ret.arr[n++] = arr1.arr[j++];
    } else {
        ret.arr[n++] = arr2.arr[i++];
    }
}
while (j < arr1.len) {
    ret.arr[n++] = arr1.arr[j++];
}
while (i < arr2.len) {
    ret.arr[n++] = arr2.arr[i++];
}

问题点:

  • i被用来判断是否越界arr1,但实际访问的是arr2的元素;j被用来判断是否越界arr2,但实际访问的是arr1的元素
  • 收尾循环中,用j遍历arr1、i遍历arr2,完全不符合变量定义逻辑

修正后的合并逻辑:

int i = 0, j = 0, n = 0;
// 按降序合并,优先取较大的元素
while (i < arr1.len && j < arr2.len) {
    if (arr1.arr[i] > arr2.arr[j]) {
        ret.arr[n++] = arr1.arr[i++];
    } else {
        ret.arr[n++] = arr2.arr[j++];
    }
}
// 处理arr1的剩余元素
while (i < arr1.len) {
    ret.arr[n++] = arr1.arr[i++];
}
// 处理arr2的剩余元素
while (j < arr2.len) {
    ret.arr[n++] = arr2.arr[j++];
}

次要问题:长度变量存在溢出风险

combine函数中定义的长度变量使用了uint8_t类型:

uint8_t len_arr = arr1.len + arr2.len;

uint8_t的最大值是255,若两个数组总长度超过255会直接溢出,导致内存分配不足。建议改用size_t或int类型:

size_t len_arr = arr1.len + arr2.len;

可选优化:merge_k函数简化

你当前的merge_k函数一开始做了不必要的内存分配和拷贝,可以直接初始化空数组再逐个合并,减少内存操作:

ArrayWithLength merge_k(ArrayWithLength *arrs, size_t count) {
    ArrayWithLength ret = {NULL, 0};
    for (size_t i = 0; i < count; i++) {
        ArrayWithLength temp2 = combine(ret, arrs[i]);
        free(ret.arr);
        ret = temp2;
    }
    return ret;
}

修正后,你的测试用例会输出预期的降序结果:[9, 8, 8, 8, 8, 8, 8, 4, 2, 2, 1]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 06:40:28