解题思路:

第一步 先判断是否有环 快慢指针

第二步 如果有环的话 把环的长度计算出来

第三步 最为重要的一步,既然我们知道了环的长度 那么我们就假设把环从节点处展开 变成一条没有环的直线链表,这种情况下 两个慢指针 一次都走一步,如果把其中一个指针A从头开始先走一个环的长度 另一个指针B还是从头走,大家好好想想 当A走到尾巴的时候 是不是B刚好走到之前环的入口处! 这里可以画图理解

图片说明

/*
 public class ListNode {
    int val;
    ListNode next = null;

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

    public ListNode EntryNodeOfLoop(ListNode pHead) {
        //第一步 先判断是否有环 快慢指针
        if(pHead == null || pHead.next == null){
            return null;
        }
        ListNode fast = pHead;
        ListNode slow = pHead;
        boolean hasLoop = false;
        while(fast.next != null){
            fast = fast.next.next;
            if(fast == null){
                break;
            }
            slow = slow.next;
            if(fast == slow){
                hasLoop = true;
                break;
            }
        }
        if(hasLoop){
           //第二步 如果有环的话 把环的长度计算出来
            int n = 1;
            fast = fast.next;
            while(fast != slow){
                n ++;
                fast = fast.next;
            }
            //第三步 最为重要的一步
            //既然我们知道了环的长度 那么我们就假设把环从节点处展开 变成一条没有环的直线链表
            //这种情况下 两个慢指针 一次都走一步,如果把其中一个指针A从头开始先走一个环的长度 另一个指针B还是从头走
            //大家好好想想 当A走到尾巴的时候 是不是B刚好走到之前环的入口处! 这里可以画图理解
            fast = pHead;
            slow = pHead;
            for(int i = 0 ;i< n;i++){
                fast = fast.next;
            }
            while(fast != slow){
                fast = fast.next;
                slow = slow.next;
            }
            return fast;
        } else {
            return null;
        }
    }
}