LC-环形链表(找环的入口)

LC-环形链表(找环的入口)

链接:https://leetcode.cn/problems/linked-list-cycle-ii/

描述:给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。
上一篇我们已经说了怎么判断是否有环,这篇来看看怎么找到环的入口。

思路:我们设起点到环入口是a步,环是b步,多走k步
例如慢指针走的是:a + 0 + k
快指针是: a + 2b + k
快慢指针一个起点,快指针的速度是慢指针的2倍,所以快指针走的距离也是慢指针的2倍,快 - 慢 = 慢,2b步就是多走的,那么慢指针走的就是2b步。
另外,走a+nb步都是停在环的入口处,所以相遇后再走a步(a+2b)会走到入口,但是我们不知道a是多少,可以让一个指针(比如慢指针)回到起点,
然后两个指针每次都是走一步,走a步后就会在入口处相遇。
代码:

  	public static ListNode detectCycle(ListNode head) {
        if (head == null || head.next == null) {
            return null;
        }
        if (head == head.next) {
            return head;
        }
        ListNode a = head, b = head;
        while (b != null && b.next != null) {
            a = a.next;
            b = b.next.next;
            if (a == b) {
                //让a指针回到起点
                a = head;
                while (a != b) {
                    //两个指针每次都走一步
                    a = a.next;
                    b = b.next;
                }
                return a;
            }
        }
        return null;
    }

你可能感兴趣的:(数据结构与算法,链表,数据结构)