题目描述:
一个链表中包含环,请找出该链表的环的入口结点。
解法:
假如从头结点1出发,2为环的入口,3为相遇的点。 1到2 距离为a ,2到3距离为b ,3到2距离为c有两个跟进节点同时前进,p1一次前进一步,p2一次前进两步。最终相遇在3.
则有 p1前进的距离:a+b
p2前进的距离: a+b+(c+b)
其中p2比p1多走了一个环的距离,且速度为p1的两倍,即距离刚好还是p1的两倍
所以有a+b+(c+b)=2(a+b) 即 a=c, 从相遇点3到入口2的距离 = 头结点1 到入口2的距离
代码:
ListNode* EntryNodeOfLoop(ListNode* pHead)
{
ListNode* head = pHead ;
if(pHead ==NULL || pHead->next == NULL)
return NULL;
ListNode* p1 = pHead->next;
ListNode* p2 = pHead->next->next;
while(p1 != p2)
{
p1 = p1->next;
p2 = p2->next->next;
}
while(p1!=head)
{
p1 = p1->next;
head = head->next;
}
return head;
}