LeetCode 142. 环形链表 II
创始人
2024-02-02 00:19:42
0

题目链接:https://leetcode.cn/problems/linked-list-cycle-ii/

思路如下:

用两个指针 fast, slow 同时从起点开始走,fast 每次走两步,slow 每次走一步。

如果过程中 fast 走到 null,则说明不存在环。否则当 fast 和 slow 相遇后,让 slow 回到起点,fast 待在原地不动,然后两个指针每次分别走一步,当再次相遇时,相遇点就是环的入口。

证明:

在这里插入图片描述

如上图所示,aaa 是起点,bbb 是环的入口,ccc 是两个指针的第一次相遇点,ababab 之间的距离是 xxx,bcbcbc 之间的距离是 yyy,cbcbcb 之间的距离是 zzz。

第一次相遇时,slow 所走的距离是 x+yx+yx+y,fast 所走的距离是 x+(y+z)∗n+yx+(y+z)∗n+yx+(y+z)∗n+y。

因为 fast 走过的距离是 slow 的两倍,所以有 x+(y+z)∗n+y=2(x+y)x+(y+z)∗n+y=2(x+y)x+(y+z)∗n+y=2(x+y),即 x=(n−1)∗(y+z)+zx=(n−1)*(y+z)+zx=(n−1)∗(y+z)+z。

那么我们让 fast 从 ccc 点开始走,走 xxx 步,会恰好走到 bbb 点;让 slow 从 aaa 点开始走,走 xxx 步,也会走到 bbb 点。

C++ 代码如下:

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode(int x) : val(x), next(NULL) {}* };*/
class Solution {
public:ListNode *detectCycle(ListNode *head) {auto fast = head, slow = head;while (true) {if (fast == NULL || fast->next == NULL) return NULL;fast = fast->next->next;slow = slow->next;if (fast == slow) break;}slow = head;while (fast != slow) {fast = fast->next;slow = slow->next;}return fast;}
};

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
一帆风顺二龙腾飞三阳开泰祝福语... 本篇文章极速百科给大家谈谈一帆风顺二龙腾飞三阳开泰祝福语,以及一帆风顺二龙腾飞三阳开泰祝福语结婚对应...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...