142. 环形链表 II

做题思路 or 感想 :

  1,这一题用快慢指针来判断是否有环,快慢指针同一起点,速度不同,如果有环,则必定会相遇

  2,第二个有意思的点就是数论环节来弄出环入口了,真的太精妙了,但因为我表述能力不好,这里就不谈了

 1 /**
 2  * Definition for singly-linked list.
 3  * struct ListNode {
 4  *     int val;
 5  *     ListNode *next;
 6  *     ListNode(int x) : val(x), next(NULL) {}
 7  * };
 8  */
 9 class Solution {
10 public:
11     ListNode *detectCycle(ListNode *head) {
12         ListNode* slow = head;
13         ListNode* fast = head;
14         if (head == nullptr)return nullptr; //防止奇怪测试用例
15         while (fast != nullptr && fast->next != nullptr) {  //这里要注意!
16         //因为fast是走两下,所以要注意fast可能正好走到最后一个节点,也可能走过头到nullptr里了
17             fast = fast->next->next;    
18             slow = slow->next;
19             if (fast == slow) {     //因为快慢指针同一起点,速度不同,如果有环,则快的指针必定能追上慢指针,则证明有环
20                 ListNode* temp = head;
21                 while (temp != slow) {  //这里就是数论环节了,说实话这里数论推导相当精妙
22                     temp = temp->next;
23                     slow = slow->next;
24                 }
25                 return slow;
26             }
27         }
28         return nullptr;
29     }
30 };

 

posted @ 2022-03-23 18:54  北原春希  阅读(26)  评论(0)    收藏  举报