struct ListNode* EntryNodeOfLoop(struct ListNode* pHead )
{
// write code here
struct ListNode* slow=pHead;//慢指针
struct ListNode* fast=pHead;//快指针
while(fast && fast->next)
{
slow=slow->next;//慢指针走一步
fast=fast->next->next;//快指针走两步
if(slow==fast)//如果相遇说明有环
{
struct ListNode* meet=slow;
struct ListNode* list=pHead;
while(meet!=list)//他俩相遇的节点,就是环的入口
{
meet=meet->next;//一个指针从相遇的结点开始走
list=list->next;//一个指针从头节点开始走
}
return meet;
}
}
return NULL;
}
(N-1)*c+c-x=l
n:快指针绕环走了多少圈
c:环的长度
x: 快指针和慢指针在环中相遇的节点
l: 头节点到环的长度