题目描述
一个链表中包含环,请找出该链表的环的入口结点。
思路
- 找到环中结点。一个慢指针每次走一步,一个快指针一次走两步,两个指针相遇即为环中结点meeting node,同时meetingnode到入口结点距离和头结点到入口结点距离相同
- 解释: 同时从头结点出发,快指针路径是慢指针路径两倍,同时快指针和慢指针路径只差为环的长度,则头指针到meeting node距离即为环的长度。
code
/*
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* pquick=pHead;
ListNode* pslow=pHead;
bool notfirst=false;
while(pquick&&pslow) // find meeting node in circle
{
if(pquick==pslow&¬first)
{
break;
}
pslow=pslow->next;
if(pquick->next)
pquick=pquick->next->next;
else
return NULL;
notfirst=true;
}
pslow=pHead;
while(pslow&&pquick&&pslow!=pquick)// find entry of circle
{
pslow=pslow->next;
pquick=pquick->next;
}
return pslow;
}
};