做题心路:

首先我自己有推导过,但是,公式是错误的,以为是同一个节点或者上一个节点。但是,经过视频讲解后,发现是有公式的,

主要是,x+y == 是等于一个整数倍环的长度,而,y+z 就是一个环的长度,所以,也就是上面的公式:

x+y = k*(y+z)

所以,最终可以推导出, fast 指针从开头一步步走,和 slow指针在碰撞的地方,一步步走一定是可以相遇的。

import java.util.*;
/*
 public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}
*/
public class Solution {

    // 实现思路很简单,就是利用快慢指针相碰后,知道有没有环
    // 同时记录碰撞节点的上一个节点,就是环的入口了,
    // 这是我画图总结出来的规律
    public ListNode EntryNodeOfLoop(ListNode pHead) {
        ListNode slow = hasCycle(pHead);
        if(slow ==null) {
            return null;
        }

        ListNode fast = pHead;
        while(slow!=fast) {
            fast = fast.next;
            slow = slow.next;
        }
        return slow;
    }

    /**
     * 判断链表是否有环
     * @param pHead待检查的链表
     * return 返回碰撞时的链表节点
     */
    ListNode hasCycle(ListNode pHead) {
        if(pHead==null) {
            return pHead;
        }
        ListNode slow = pHead;
        ListNode fast = pHead;
        while(fast!=null && fast.next!=null) {
            slow = slow.next;
            fast = fast.next.next;
            if(slow == fast) {
                return slow;
            }
        }
        return null;
    }
}