递归实现合并两个有序链表存在逻辑错误,请求协助排查
递归合并有序链表的逻辑错误分析与修复
嘿,我帮你揪出问题所在了!你的递归逻辑里犯了一个关键错误——每次递归时错误地同时移动了两个链表的指针,导致其中一个链表的节点直接被跳过,完全没参与合并过程。
先看你代码里的错误核心部分:
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
相关产品推荐
相关产品推荐

