调试LeetCode双链表交点查找函数:请求排查代码错误
问题排查:Intersection of Two Linked Lists 解法错误分析
思路层面的问题
循环终止条件逻辑偏差
你假设其中一个链表指针先到末尾时,两个指针都走了y+z步,但代码中判断的是firstA.next==null或firstB.next==null——此时指针仅走到最后一个节点(未到null),实际步数是y+z-1,导致后续剩余长度计算完全错误。未处理长度相等的场景
当两个链表长度相同时,firstA.next和firstB.next会同时变为null(无论是否有交点),此时第一个循环会触发任意一个if分支,但后续逻辑完全不适用长度相等的情况,必然返回错误结果。缺少无交点判断逻辑
若两个链表无交点,你的代码不会检测该情况,会错误返回某个节点而非null。核心逻辑缺失关键步骤
你的思路中,确定较长链表的剩余长度后,应该让新起点指针和较长链表的当前指针同步遍历直到相遇,但代码在第二次循环后直接返回newStart,跳过了这一关键的验证步骤。
代码层面的具体bug
- 无限循环风险:若两个链表长度相等且无交点,第一个循环会终止,但后续逻辑依然错误;若长度相等且有交点,指针会走到最后一个节点,两个if条件同时满足,触发第一个分支后逻辑依然失效。
- 指针移动逻辑错误:第二次循环中让
middle和newStart走到middle为null,步数计算完全不符合初始思路,导致newStart的位置根本不是交点的前置位置。 - 未处理空链表边界:若其中一个链表为空,代码会直接进入循环,触发空指针异常。
修正后的代码(基于你的思路调整)
public static ListNode getIntersectionNode(ListNode headA, ListNode headB) { if (headA == null || headB == null) return null; ListNode ptrA = headA; ListNode ptrB = headB; // 第一步:让指针走到链表末尾,确定长度差 while (ptrA != null && ptrB != null) { ptrA = ptrA.next; ptrB = ptrB.next; } // 区分长短链表,获取剩余未走完的部分 ListNode longer = ptrA != null ? headA : headB; ListNode shorter = ptrA != null ? headB : headA; ListNode remaining = ptrA != null ? ptrA : ptrB; // 长链表指针先走长度差的步数 while (remaining != null) { longer = longer.next; remaining = remaining.next; } // 同步遍历,寻找交点 while (longer != shorter) { longer = longer.next; shorter = shorter.next; } // 无交点时longer和shorter会同时为null,直接返回即可 return longer; }
修正说明
- 改为判断
ptrA != null && ptrB != null,让指针真正走到链表末尾(null),确保步数计算准确。 - 通过剩余指针是否为null判断链表长短,计算长度差并让长链表起点先走对应步数。
- 同步遍历调整后的两个指针,直到相遇(交点)或同时为null(无交点)。
- 增加空链表边界处理,避免空指针异常。
内容的提问来源于stack exchange,提问作者haifisch123
相关产品推荐
相关产品推荐

