Skip to content

介绍

阶段1(判断是否有环)
龟一次走一步,免子一次走两步。
当兔于能走到终点时,不存在环。
当兔子能追上龟时,可以判断存在环
阶段2(判断环的入口)
从它们第一次相遇开始,龟回到起点(注意特殊情况),兔于保持原位不变。
龟和兔子一次都走一步
当再次相遇时,地点就是环的入口

题目

给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。

题解

弗洛伊德龟兔赛跑算法

ts
public class Solution {
    public ListNode detectCycle(ListNode head) {
        ListNode t = head; //兔子
        ListNode g = head; //乌龟
        while (t != null && t.next != null) {
            g = g.next;
            t = t.next.next;
            if (t == g) { //相遇
                g = head; //乌龟回到起点
                while (true) {
                    if (g == t) { //判断是否相遇,排除特殊情况
                        return t;
                    }
                    t = t.next;
                    g = g.next;
                }
            }
        }
        return null;
    }
}

上次更新于: