链表中等1 种解法

#142环形链表 II

若链表有环,返回环的入口节点;否则返回 null。

#链表#双指针

解题主线

01

设头到入口距离为 a、入口到首次相遇点距离为 b,可由快慢指针路程关系推出相遇点再走 a 步会到入口。

02

首次相遇后让一个指针回到 head,两个指针都改为每次一步,再次相遇处就是环入口。

解法 1Floyd 定位环入口

先用快慢指针判断并找到环内相遇点,再用两个同速指针从 head 和相遇点定位入口。

时间复杂度

O(n)

空间复杂度

O(1)

142. 环形链表 II · Floyd 定位环入口
public class Solution {
    static final class ListNode {
        int val;
        ListNode next;
        ListNode(int val) { this.val = val; }
    }

    public ListNode detectCycle(ListNode head) {
        ListNode slow = head;
        ListNode fast = head;
        do {
            if (fast == null || fast.next == null) return null;
            slow = slow.next;
            fast = fast.next.next;
        } while (slow != fast);

        ListNode fromHead = head;
        while (fromHead != slow) {
            fromHead = fromHead.next;
            slow = slow.next;
        }
        return fromHead;
    }
}

先用快慢指针判断并找到环内相遇点,再用两个同速指针从 head 和相遇点定位入口。

  • 两个旧文件均为同一 Floyd 算法,因此只展示一次。

边界与易错点

  • 第一阶段退出后必须先确认确实相遇,不能把无环时的 null 当作相遇点。
  • 旧 Q142_detectCycle 的文档链接误指向第 54 题,与算法本身无关。
整理来源

由旧仓库源码复核、去重并整理;展示代码已按 Java 21 语义修正明显问题。

Q142_detectCycle.javaQ142_linkedListCycleII.java