
[LeetCode题解]142. 环形链表 II | 快慢指针
发布日期:2021-05-09 04:32:23
浏览次数:15
分类:博客文章
本文共 1156 字,大约阅读时间需要 3 分钟。
解题思路
本题是在基础上的拓展,如果存在环,要找出环的入口。
如何判断是否存在环,我们知道通过快慢指针,如果相遇就表示有环。那么如何找到入口呢?
如下图所示的链表:
当 fast
与 slow
第一次相遇时,有以下关系:
fast = 2 * slowslow = a + n*b - c // 假设 slow 走了 n 圈fast = a + m*b - c // 假设 fast 走了 m 圈那就有:a + m*b - c = 2*(a + n*b - c)继而得到:a = c + (m-n)*b而(m-n)*b表示走了 m-n 圈,不影响 c 的大小,即可忽略,最终得到:a = c
通过上面的推导,我们知道相遇点距环的入口的距离(c)与开头到环的入口的距离(a)相等。
因此当 fast
与 slow
相遇时,只要 fast
重新定位到表头,与 slow
一起走,当它们再次相遇时,就是环的入口。
代码
/** * Definition for singly-linked list. * public class ListNode { * public int val; * public ListNode next; * public ListNode(int x) { * val = x; * next = null; * } * } */public class Solution { public ListNode DetectCycle(ListNode head) { ListNode fast = head, slow = head; while(fast != null && fast.next != null){ fast = fast.next.next; slow = slow.next; if(fast == slow) { // 存在环 fast = head; while(fast != slow) { fast = fast.next; slow = slow.next; } return fast; } } return null; }}
复杂度分析
- 时间复杂度:\(O(n)\),其中 \(n\) 是链表长度
- 空间复杂度:\(O(1)\)
发表评论
最新留言
做的很好,不错不错
[***.243.131.199]2025年04月20日 07时37分07秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
elementUi源码解析(1)--项目结构篇
2019-03-06
Nmap扫描工具介绍
2019-03-06
算法笔记:递归、动态规划
2019-03-06
常用Windows 快捷键
2019-03-06
linux命令-压缩与打包
2019-03-06
ORACLE 11g 生产中高水位线(HWM)处理
2019-03-06
centos 6.x 编译安装 pgsql 9.6
2019-03-06
weblogic 服务器部署SSL证书
2019-03-06
oracle 11g not in 与not exists 那个高效?
2019-03-06
Linux 安装Redis 5.0(以及参数调优)
2019-03-06
html5 Game开发系列文章之 零[开篇]
2019-03-06
Golang Web入门(4):如何设计API
2019-03-06
ES6基础之——new Set
2019-03-06
玩玩小爬虫——试搭小架构
2019-03-06
Javascript之旅——第八站:说说instanceof踩了一个坑
2019-03-06
Javascript之旅——第九站:吐槽function
2019-03-06
Sql Server之旅——第十站 看看DML操作对索引的影响
2019-03-06
双十一来了,别让你的mongodb宕机了
2019-03-06
深入解析 HTTP 缓存控制
2019-03-06