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

调试LeetCode双链表交点查找函数:请求排查代码错误

问题排查:Intersection of Two Linked Lists 解法错误分析

思路层面的问题

  1. 循环终止条件逻辑偏差
    你假设其中一个链表指针先到末尾时,两个指针都走了y+z步,但代码中判断的是firstA.next==null或firstB.next==null——此时指针仅走到最后一个节点(未到null),实际步数是y+z-1,导致后续剩余长度计算完全错误。

  2. 未处理长度相等的场景
    当两个链表长度相同时,firstA.next和firstB.next会同时变为null(无论是否有交点),此时第一个循环会触发任意一个if分支,但后续逻辑完全不适用长度相等的情况,必然返回错误结果。

  3. 缺少无交点判断逻辑
    若两个链表无交点,你的代码不会检测该情况,会错误返回某个节点而非null。

  4. 核心逻辑缺失关键步骤
    你的思路中,确定较长链表的剩余长度后,应该让新起点指针和较长链表的当前指针同步遍历直到相遇,但代码在第二次循环后直接返回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;
}

修正说明

  1. 改为判断ptrA != null && ptrB != null,让指针真正走到链表末尾(null),确保步数计算准确。
  2. 通过剩余指针是否为null判断链表长短,计算长度差并让长链表起点先走对应步数。
  3. 同步遍历调整后的两个指针,直到相遇(交点)或同时为null(无交点)。
  4. 增加空链表边界处理,避免空指针异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 17:47:35