问题描述:
给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。
源码:
本来我是按照书上的方法写的,最后看到一个大佬的博客,秒啊!
则:相遇时
快指针路程=a+(b+c)m+b
慢指针路程=a+(b+c)n+b
其中b+c为环的长度,m为绕环的圈数(m>=1, n>0, m>n)。
快指针走的路程是慢指针的两倍,所以:
(a+(b+c)n+b)*2=a+(b+c)m+b
化简可得:
a=(m-n)(b+c)+c 这个式子的意思是: 链表头到环入口的距离=相遇点到环入口的距离+(m-n)圈环长度。其中m-n>0圈。所以两个指针分别从链表头和相遇点出发,最后一定相遇于环入口。
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
*/
class Solution {
public:
ListNode* EntryNodeOfLoop(ListNode* pHead) {
if(!pHead || !pHead->next) return nullptr;
auto s = pHead, q = pHead;
while(q && q->next) {
s = s->next;
q = q->next->next;
if(s == q) {
q = pHead;
while(s != q) {
s = s->next;
q = q->next;
}
return q;
}
}
return nullptr;
}
};