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 @   北原春希  阅读(22)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示