视频参考链接【https://www.bilibili.com/video/BV1dk4y1i7Jp/?spm_id_from=333.337.search-card.all.click&vd_source=6d33796b099e126edbab9e2da33ff9e4】
(B站吴师兄学算法)
解题思路
我们知道,用快慢指针可以很容易判断一条链表是否存在环,快指针fast每次走两步,慢指针slow每次走一步,那么若进入环中,每次他们之间的相对距离都会-1,直到两者相遇。虽然这能很快的知道是否存在环,但是它能否帮我们找到环的入口呢,答案是肯定的
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
*/
class Solution {
public:
ListNode* EntryNodeOfLoop(ListNode* pHead) {
ListNode* fast = pHead;
ListNode* slow = pHead;
while (fast) {
slow = slow->next;
if (fast->next == NULL) return NULL;
fast = fast->next->next;// 若快指针的下一步不能走,则说明两指针不会相遇
if (fast == slow) {
fast = pHead;
while (fast != slow) {
fast = fast->next;
slow = slow->next;
}
return fast;
}
}
return NULL;
}
};