在相遇时
快指针路程=**a+(b+c)k+b** ,k>=1 其中b+c为环的长度,k为绕环的圈数(k>=1,即最少一圈,不能是0圈,
不然和慢指针走的一样长,矛盾)。
慢指针路程=**a+b **
快指针走的路程是慢指针的两倍,那么有:
**(a+b)*2=a+(b+c)k+b **
整理可得
**a=(k-1)(b+c)+c** 意思为:链表头到环入口的距离=相遇点到环入口的距离+(k-1)圈环长度。
其中k>=1,所以k-1>=0圈。所以两个指针分别从链表头和相遇点出发,最后一定相遇于环入口。
//双指针解法
class Solution {
public:
ListNode* EntryNodeOfLoop(ListNode* pHead) {
ListNode* fast=pHead;
ListNode* slow=pHead;
while(fast->next!=NULL&&fast!=NULL){//特别容易越界,注意判断
fast=fast->next->next;//快指针走两步
slow=slow->next;//慢指针走一步
if(fast==slow){//第一次相遇时
break;
}
}
if(fast==NULL||fast->next==NULL)return NULL;//没有环的情况
//cout<<fast->val<<endl;
fast=pHead;
while(fast!=slow){//相遇时为链表入口
fast=fast->next;
slow=slow->next;
}
return slow;
}
};