LeetCode 60:寻找两个链表交点代码在特定测试用例失败求助
LeetCode 第60题《寻找两个链表的交点》代码错误修复
问题定位
你的代码逻辑框架正确,但在两个链表长度相等的测试用例中会失效,比如你提到的输入均为[2,2,4,5,4]且交点为节点4的场景。
错误原因
问题出在longList和shortList的赋值逻辑上:
ListNode longList = (aN > bN) ? headA : headB; ListNode shortList = (aN < bN) ? headA : headB;
当两个链表长度相等(aN == bN)时:
aN > bN为false,longList被赋值为headBaN < bN为false,shortList也被赋值为headB
此时两个指针指向同一个链表,自然无法正确比较headA和headB的交点。
修正方案
调整shortList的赋值逻辑,确保长度相等时,longList和shortList分别指向两个不同的输入链表:
public class Solution { public ListNode getIntersectionNode(ListNode headA, ListNode headB) { int aN = 0; ListNode a = headA; while (a != null) { aN++; a = a.next; } int bN = 0; ListNode b = headB; while (b != null) { bN++; b = b.next; } ListNode longList, shortList; if (aN > bN) { longList = headA; shortList = headB; } else { longList = headB; shortList = headA; } for (int i = 0; i < Math.abs(aN - bN); i++) { longList = longList.next; } while (longList != null && shortList != null) { if (longList == shortList) { return longList; } longList = longList.next; shortList = shortList.next; } return null; } }
修正说明
用if-else替代原有的两个独立三元表达式,保证:
- 当
aN > bN:长链表为headA,短链表为headB - 当
aN <= bN:长链表为headB,短链表为headA
这样无论两个链表长度是否相等,longList和shortList都会分别指向两个输入链表,后续的同步遍历和节点比较就能正常执行。
验证
针对你提到的测试用例,修正后的代码会:
- 计算出两个链表长度均为5,差值为0
longList指向headB,shortList指向headA- 从两个链表的头节点开始同步遍历,当遍历到第三个节点(值为4的节点)时,会检测到两个节点引用相等,返回该节点,符合预期。
内容的提问来源于stack exchange,提问作者Em Ae
相关产品推荐
相关产品推荐

