LeetCode142. 环形链表 II

题目

分析

 

此图摘自代码随想录

可以列出方程:(x + y) * 2 = x + y + n (y + z) ——快指针走的距离是慢指针走的两倍

化简:  x + y = n (y + z)

       x = n (y + z) - y

      x = (n - 1) (y + z) + z——这是最终结果,表示从头结点出发一个指针,从相遇节点 也出发一个指针,这两个指针每次只走一个节点, 那么当这两个指针相遇的时候就是 环形入口的节点

代码

 1 class Solution {
 2 public:
 3     ListNode *detectCycle(ListNode *head) {
 4         ListNode *fast = head;ListNode *slow = head;
 5         while(fast != NULL && fast->next != NULL){
 6             slow = slow->next;
 7             fast = fast->next->next;
 8             if(fast == slow){
 9                 ListNode *s1 = head;
10                 ListNode *s2 = fast;
11                 while(s1 != s2){
12                     s1 = s1->next;
13                     s2 = s2->next;
14                 }
15                 return s1;
16             }
17         }
18         return NULL;
19     }
20 };

 

posted @ 2021-03-19 20:35  Uitachi  阅读(21)  评论(0)    收藏  举报