算法1
快慢指针
假设快指针和慢指针相遇了,多出来的距离为y.
那么回退y步。这个慢指针在入口,快指针走了2x步还差y步到入口。
说明 2x+y 能到达入口。
现在走了x+y步,还差x步。
C++ 代码
class Solution {
public:
ListNode *entryNodeOfLoop(ListNode *head) {
if (head == NULL) return NULL;
ListNode* fast = head;
ListNode* slow = head;
while (fast && fast->next) {
slow = slow->next;
fast = fast->next->next;
if (slow == fast) {
break;
}
}
if (fast == NULL || fast->next == NULL) {
return NULL;
}
ListNode* p2 = head;
while (p2 != slow) {
p2 = p2->next;
slow = slow->next;
}
return p2;
}
};