Given a linked list, return the node where the cycle begins. If there is no cycle, return null
.
To represent a cycle in the given linked list, we use an integer pos
which represents the position (0-indexed) in the linked list where tail connects to. If pos
is -1
, then there is no cycle in the linked list.
Note: Do not modify the linked list.
Example 1:
Input: head = [3,2,0,-4], pos = 1 Output: tail connects to node index 1 Explanation: There is a cycle in the linked list, where tail connects to the second node.
Example 2:
Input: head = [1,2], pos = 0 Output: tail connects to node index 0 Explanation: There is a cycle in the linked list, where tail connects to the first node.
Example 3:
Input: head = [1], pos = -1 Output: no cycle Explanation: There is no cycle in the linked list.
这题解题的思路在于:在第一次相遇点位置pos,从该位置到环入口Join的距离=从头结点Head到环入口Join的距离
假设环的长度是r,在第一次相遇时,慢指针走过的路程:s=lenA+x,快指针走过的路程:2s=lenA+nr+x,所以:lenA+x=nr,即:LenA=nr-x。
所以在第一次相遇之后,一个指针从head走到join的路程,另一个指针从pos走到join。
方法一(C++)
1 ListNode *detectCycle(ListNode *head) { 2 ListNode* slow=head,*fast=head; 3 while(fast&&fast->next){ 4 slow=slow->next; 5 fast=fast->next->next; 6 if(slow==fast) 7 break; 8 } 9 if(!fast||!fast->next) 10 return NULL; 11 slow=head; 12 while(slow!=fast){ 13 slow=slow->next; 14 fast=fast->next; 15 } 16 return slow; 17 }
(java):
1 ListNode slow=head,fast=head; 2 while(fast!=null&&fast.next!=null){ 3 slow=slow.next; 4 fast=fast.next.next; 5 if(slow==fast) 6 break; 7 } 8 if(fast==null||fast.next==null) 9 return null; 10 slow=head; 11 while(slow!=fast){ 12 slow=slow.next; 13 fast=fast.next; 14 } 15 return slow; 16 }