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

递归实现合并两个有序链表存在逻辑错误,请求协助排查

递归合并有序链表的逻辑错误分析与修复

嘿,我帮你揪出问题所在了!你的递归逻辑里犯了一个关键错误——每次递归时错误地同时移动了两个链表的指针,导致其中一个链表的节点直接被跳过,完全没参与合并过程。

先看你代码里的错误核心部分:

if(headA.data<headB.data) {
    headA.next=mergeLists(headA.next,headB.next); // 这里不该传headB.next
    return headA;
} else{
    headB.next=mergeLists(headA.next,headB.next); // 这里同样错了
    return headB;
}

错误原因解释

当你判断headA.data < headB.data时,正确的逻辑应该是:保留当前的headA节点作为合并后链表的当前节点,然后递归合并**headA.next和原headB**(因为headB还没被选中,需要继续和headA的下一个节点比较)。但你的代码里直接把headB.next传进去了,这就相当于直接跳过了当前的headB节点,导致它永远不会被加入到合并后的链表中。

比如你的输入里,链表B的第一个节点是2,比链表A的第一个节点1大,但比第二个节点3小。但你的代码在选中1之后,直接跳到了链表B的下一个节点(4),完全没处理2,这就是为什么你的输出里缺少了2、4这些节点。

修复后的代码

把递归调用里的参数改一下,每次只移动选中节点所在链表的指针:

/* Node is defined as class Node { int data; Node next; } */
Node mergeLists(Node headA, Node headB) {
    if(headA == null) {
        return headB;
    }
    if(headB == null) {
        return headA;
    }
    
    if(headA.data < headB.data) {
        headA.next = mergeLists(headA.next, headB); // 只移动headA的指针
        return headA;
    } else {
        headB.next = mergeLists(headA, headB.next); // 只移动headB的指针
        return headB;
    }
}

修复后的逻辑说明

每次递归我们只做一件事:选当前两个链表头中较小的那个节点作为合并后链表的当前节点,然后递归处理该节点的下一个节点和另一个链表的原头节点。这样就能保证两个链表中的每一个节点都被逐一比较,不会被遗漏,最终得到完整的有序合并链表。

用你的输入测试的话,合并过程会正确遍历两个链表的所有节点,最终输出1 2 3 4 5 6 7,和期望一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:39:17