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) {
        //根据上一篇帖子求出的公式,i=tkn,当快慢指针相遇时,tk肯定为整数,,即i为环的长度的整数倍
        ListNode fastNode = pHead, slowNode = pHead;
        int i = 0;
        i++;
        slowNode = slowNode.next;
        if (slowNode == null ) return null;
        fastNode = fastNode.next.next;
        if (fastNode == null) return null;
        while (fastNode != slowNode) {
            i++;
            slowNode = slowNode.next;
            if (slowNode == null) return null;
            fastNode = fastNode.next.next;
            if (fastNode == null) return null;
        }
        //用步差为i的快慢指针遍历链表,指针会在环的第一个节点重合。
        fastNode = pHead;
        slowNode = pHead;
        for (int j = 0; j < i; j++) fastNode = fastNode.next;
        while (fastNode != slowNode) {
            slowNode = slowNode.next;
            fastNode = fastNode.next;
        }
        return fastNode;
    }
}

前题有判断链表是否有环的解法。快慢指针在第一次相遇时,慢指针走的步数一定是环长度的整数倍。求出这个值i,然后用步差为i的快慢指针遍历,会在环的第一个节点相遇。