题目描述
给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。
好题
-
考虑两个指针一快
fast
一慢low
快指针fast
每次走两步
,慢指针low
每次走一步
-
根据小学数学,圆形操场上两个小朋友跑步,一快一慢,最终他们会相遇
所以,fast
指针和low
指针一定会相遇
于某一点 -
接着把快指针
fast
指向头,并让fast
的速度变慢(fast速度等于low速度)
,最后他们还是会相遇,并且相遇点一定是环的入口点
(原理不详)
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
*/
#define Node ListNode
class Solution {
public:
ListNode* EntryNodeOfLoop(ListNode* head) {
Node* fst = head;
Node* low = head;
do {
//if(!fst->next || !fst->next->next || !low->next)
// return 0;
if(!fst|| !fst->next) return 0; //(2020-10-17简化代码
fst = fst->next->next;
low = low->next;
} while(fst != low);
fst = head;
while(fst != low)
fst = fst->next, low = low->next;
return fst;
}
};