快慢指针:141. 环形链表(判断是否存在环路)
题目描述
给定一个链表,判断链表中是否有环
题目链接
141. 环形链表
解题思路
使用快慢指针(Floyd判圈算法):从链表的头部设置两个指针,p1的步长为1, p2的步长为2,同时向前走,如果p1和p2最终能够相遇,则说明链表是有环的。
检测环的基本思想是非常简单的,可以类比成两个人在跑道上跑。只要有圈,跑的快的那个人就一定能够追上跑得慢的那个人。
代码:
public class Solution {public boolean hasCycle(ListNode head) {if (head == null) {return false;} //设置快慢指针ListNode slow = head, fast = head.next;while(slow!=null&&fast!=null&&fast.next!=null){if(slow == fast){return true;}slow = slow.next;fast = fast.next.next;}return false;}
}
扩展
求环的长度
两个人相遇的是时候,一定已经在环上了,然后两个人只要再次在环上接着跑,再次相遇的时候(也就是所谓的套圈),跑的快的那个人就比跑得慢的人整整多跑了一圈,所以环的长度也就出来了。
用算法来描述:第一次相遇后,p1和p2按照原来的步长继续向前查找,并且记录下两个指针遍历过的节点个数。当两个指针再次相遇的时候,遍历的节点数量差就是环的长度。
求环的起点
解决方法:
把其中的一个指针重置到链表头部,然后两个指针步长都为1,继续向前移动,相遇的位置即为环的起点。解释:
首先我们设第一次相遇的时候慢指针走过的节点个数为i
, 设链表头部到环的起点的长度为m
, 环的长度为n
,相遇的位 置与起点位置距离为k
。
则可以得到:
i = m + a * n + k
其中a为慢指针走的圈数。
根据快指针和慢指针的速度关系,我们可以得到另一个式子:
2 * i = m + b * n + k
参考
- Floyd判圈算法
- Floyd判圈算法
- Floyd判圈算法(龟兔赛跑算法)
快慢指针:141. 环形链表(判断是否存在环路)相关推荐
- 【LeetCode】【HOT】141. 环形链表(快慢指针)
[LeetCode][HOT]141. 环形链表 文章目录 [LeetCode][HOT]141. 环形链表 package hot;class ListNode{int val;ListNode n ...
- LeetCode 141. 环形链表 简单难度
** 141. 环形链表 ** 给定一个链表,判断链表中是否有环. 如果链表中存在环,则返回 true . 否则,返回 false . 解题思路(两种方法): 方法一:用集合set以及set.find ...
- LeetCode141. 环形链表判断链表是否有环
题目要求 原题目链接:141. 环形链表 题目要求如下: 给你一个链表的头节点 head ,判断链表中是否有环. 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环. 为了 ...
- 【Leetcode】拿捏链表(四)——160. 相交链表、141. 环形链表、142. 环形链表 II
作者:一个喜欢猫咪的的程序员 专栏:<Leetcode> 喜欢的话:世间因为少年的挺身而出,而更加瑰丽. --<人民 ...
- 141. 环形链表 golang
141. 环形链表 给定一个链表,判断链表中是否有环. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始). 如果 pos 是 -1,则在该链表中没有环. ...
- LeetCode - 141. 环形链表
141. 环形链表 import java.util.Objects;class ListNode {int val;ListNode next;ListNode(int x) {val = x;ne ...
- 【LeetCode笔记】141. 环形链表(Java、快慢指针、链表)
文章目录 题目描述 思路 & 代码 题目描述 常见题,用上了久违的快慢指针 思路 & 代码 举个例子就能明白了: 我和汽车,进行一场比赛,跑道可能是环形跑道,也可能是直道. 直道的话, ...
- leetcode 141. 环形链表(快慢指针解法)
题目 思路 绝对的经典题目,快慢指针,慢指针一次走两步,快指针一次走一步,直到两指针相遇,则说明有环. 关于评论区看到的一种思路,本质是做标记.这个办法不是很好,一方面,如果测试用例足够全的话,标记内 ...
- leetcode 141.环形链表 I - 142.环形链表 II 代码及指针相遇证明问题
⭐️ 环形链表 I 题目描述 给你一个链表的头节点 head ,判断链表中是否有环.如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环. 如果链表中存在环 ,则返回 tru ...
最新文章
- 排除hotnews主题内容页面上的热点图片推荐里的分类-hotnews主题top_hot.php
- 分享几段祖传的Python代码,拿来直接使用!
- 组合数据类型练习,英文词频统计实例9-21
- 数据结构练习 00-自测3. 数组元素循环右移问题 (20)
- (数据库系统概论|王珊)第十章数据库恢复技术-第四、五、六、七节:数据库恢复技术和数据库镜像
- 按钮跳转到其他ui界面_《明日方舟》UI/UX设计复盘
- 02HTML 超链接与图像标记各是什么,【HTML篇】3.HTML的图片标签、超链接标签
- go语言学习相关资料
- Win10之广告弹窗终结器:Process Explorer
- oracle获取当前年上一年时间,Oracle获取一年中的所有日期和一个月中的所有日期...
- 博士德服务器帐套维护密码忘记,T+账套主管的密码忘记了,怎么办
- 车机常用adb 命令总结
- Appium连接教程
- android删除无用资源文件,android删除无用资源文件的python脚本
- 什么是外网IP、内网IP?
- 典型相关分析(Canonical correlation analysis)(四): 中国城市竞争力与基础设施的相关分析
- php theexcerpt,WordPress获取文章摘要函数the_excerpt、get_the_excerpt
- php连接mysql 500错误日志_php javascript从mysql获取数据会在服务器端产生500错误
- Activiti7工作流入门和基本使用-工作流引擎介绍
- 3种方法封锁BT下载 1
热门文章
- HDU - 2204 Eddy‘s爱好(尚未完全解决)
- CF750G New Year and Binary Tree Paths(数位dp二进制+数学)
- CF464E-The Classic Problem【最短路,主席树】
- jzoj2292-PPMM【模拟,堆】
- P3810-[模板]三维偏序(陌上花开)【CDQ分治,树状数组】
- jzoj3171-[GDOI2013模拟4]重心【真·物理,二分】
- 【Trie】最长异或路径(ybtoj Trie-3/luogu 4551)
- 线段树专题-等差子序列 BZOJ-2124
- Spring JSR-250 注释
- ByteBuffer的使用