参考链接:https://blog.youkuaiyun.com/liushall/article/details/80444753
思想:先找是否有环:一快指针,一慢指针,相等即有环
找入口:
1.可在快慢指针重合的地方开始继续走慢指针,再次重合即环的长度n;一指针先走n步,另加一指针一起走,相等地方即入口
2.一指针指向头指针,一指针在重合的地方,一起单步走,相等地方即入口
解释:
头节点离环入口距离a,环长度为n
m1为慢指针走到入口,快指针所在位置:2a=(a+xn+b) -->a=xn+b
快指针离慢指针(n-b)距离,2倍速追上,需要(n-b)时间,即慢指针刚好走到m2点(重合点),m2离入口距离b,而上面的推导a=xn+b,所以再加一指针在头节点,慢指针在m2点,相同慢速走,会在入口相遇。
代码:
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
*/
class Solution {
public:
ListNode* EntryNodeOfLoop(ListNode* pHead)
{
if(pHead == NULL)return NULL;
ListNode *fast=pHead,*slow=pHead;
while(fast && fast->next)
{
fast=fast->next->next;
slow=slow->next;
if(fast == slow)
{
fast=pHead;
while(fast != slow)
{
fast=fast->next;
slow=slow->next;
}
return fast;
}
}
return NULL;
}
};