思路:快慢指针->快指针一次走两步,慢指针一次走一步。
结论:1、设置快慢指针,假如有环,一定会在环中相遇;
2、两个指针相遇后,两个指针分别在表头和相遇点重新出发,每次只走一步,最后一定相遇于环入口。
验证结论:
1、快指针一次走两步,慢指针一次走一步,慢指针一旦入环,就当作是快指针追慢指针,最后一定能追上;
2、假设快指针走的路径为:a+b+c+b,慢指针走的路径为a+b,因为快指针是慢指针走的2倍,所以:a+b+c+b=2(a+b),简化得 a=c,所以让两个指针在起始点和相遇点分别出发,一定会相遇在环入口。
代码如下:
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
*/
class Solution {
public:
ListNode* EntryNodeOfLoop(ListNode* pHead) {