题目描述
一个链表中包含环,请找出该链表的环的入口结点。
设置两个指针,p2每步走两次,p1每步走一次,若它们相遇,快指针比慢指针多走一圈,假定慢指针所走步数为K。
头结点pHead到相遇节点步数为k,一圈的步数也为k,有L(pHead,p1)=L(p2,p1),因此L(pHead,p0)=L(p,p0)(对应的优弧的长度),
把p2设置为头结点,同步走,由于p1,p2到环的入口点距离相等,因此p1,p2相遇的节点即为环的入口节点。
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
*/
class Solution {
public:
ListNode* EntryNodeOfLoop(ListNode* pHead)
{
if(!pHead) return NULL;
ListNode* p1=pHead;
ListNode* p2=pHead;
while(p2&&p2->next)
{
p1=p1->next;
p2=p2->next->next;
if(p1==p2)
{
p2=pHead;
{
while(p1!=p2)
{
p1=p1->next;
p2=p2->next;
}
if(p1==p2)
return p2;
}
}
}
return NULL;
}
};