/**
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param pHead ListNode类
* @return ListNode类
*/
struct ListNode* EntryNodeOfLoop(struct ListNode* pHead ) {
//思路
//判断是否有环
//在有环的情况下,设【头结点->环入口】距离为X,【环入口->相遇结点】距离为Y,【相遇结点->环入口】距离为Z
//相遇时,slow指针共走了X+Y,fast则为2X+2Y(slow的两倍,已经绕环一圈多了)。
//则有,Z = 2X + 2Y - 2Y - X = X,即Z = X,【相遇结点->环入口】等于【头结点->环入口】
//因此从相遇点和头结点开始设置指针遍历,二者相同时为环入口
struct ListNode* fast = pHead;
struct ListNode* slow = pHead;
if (pHead == NULL) {
return NULL;
}
while ((slow != NULL) && (fast != NULL) && (fast->next != NULL)) {
slow = slow->next;
fast = fast->next->next;
if (slow == fast) {
slow = pHead;
while (slow != fast) {
slow = slow->next;
fast = fast->next;
}
return slow;
}
}
return NULL;
}