思路:快慢指针->快指针一次走两步,慢指针一次走一步。
结论: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) { ? ? ? ? ListNode *fast = pHead; ? ? ? ? ListNode *slow = pHead; ? ? ? ? //先找到相遇节点,再从起始节点和相遇节点分别出发,相遇即是环的入口 ? ? ? ? while(fast != NULL && fast->next != NULL){ ? ? ? ? ? ? fast = fast->next->next; ? ? ? ? ? ? slow = slow->next; ? ? ? ? ? ? if (fast == slow){ ? ? ? ? ? ? ? ? while(slow != pHead){ ? ? ? ? ? ? ? ? ? ? pHead = pHead->next; ? ? ? ? ? ? ? ? ? ? slow = slow->next; ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? return slow; ? ? ? ? ? ? } ? ? ? ? } ? ? ? ? return NULL; ? ? } };
|