链表带环问题(LeetCode 142)
目录
- 记录算法思路
- 分析题目
- 1. 判断链表是否带环
- 2.链表所带环的起始位置
- 总结
记录算法思路
在LeetCode上做到了一个有意思的题,思路非常有意思,记录如下
原题链接 环形链表Ⅱ
分析题目
通过题目可以分析出这个问题可以分为两个问题
- 判断链表是否带环
- 链表所带的环的起始位置
刚看到题目的时候觉得题目写的太模糊了,为了不浪费时间,将题目分析写一遍。
1. 判断链表是否带环
假设环形链表如下:
方法:
设置快慢指针,快指针每次走两步,慢指针每次走一步,当两指针进环后最终一定会相遇。
若相遇,则是带环链表,若最后快指针走到空,则不是带环链表
代码实现:
struct ListNode *Fast = head;struct ListNode *Slow = head;//判断是否带环while (Fast != NULL && Fast->next != NULL){Fast = Fast->next->next;Slow = Slow->next;if (Fast == Slow)break;}if (Fast == NULL || Fast->next == NULL)return NULL;
注意:
判断快指针时要一起判断快指针下一个结点的next是否为空,因为快指针一次跳过两个,若快指针后面结点为最后一个结点,则会跳过去,有时候会陷入死循环。
2.链表所带环的起始位置
假设链表进入环之前所走的长度为L,慢指针进入后走长度为N,两指针相遇。环的长度为M
有以下关系:
快指针在环内至少走一圈,才与慢指针相遇,则(x≥1),运算出上式。
可得出,两指针相遇后与头指针一起走最后将在换入口出相遇。
代码实现:
struct ListNode *detectCycle(struct ListNode *head) {struct ListNode *Fast = head;struct ListNode *Slow = head;//判断是否带环while (Fast != NULL && Fast->next != NULL){Fast = Fast->next->next;Slow = Slow->next;if (Fast == Slow)break;}if (Fast == NULL || Fast->next == NULL)return NULL;//判断进环位置while (head != Fast){head = head->next;Fast = Fast->next;}return head;
}
总结
这个问题的解决办法有一部分用数学方法,不得不说,第一个解决这个问题的人的思路还是非常厉害的。
链表带环问题(LeetCode 142)相关推荐
- 数据结构-链表带环问题
目录 一.如何判断一个链表是否有环? 二.如何证明fast和slow不会在回环中错过,永远都遇不上? 三.为什么slow走1步,fast走的是2步?能不能fast一次走3或者n步? (1)fast走3 ...
- 使用java判断环形链表的起点,Leetcode 142题
判断环形链表的起点(java语言)Leetcode 142题 Leetcode 142题 判断环形链表的起点 在这里我们是使用快慢指针 (双指针) 的方式来解决此问题. 我们设置一个慢指针指向头结 ...
- c/c++单链表面试题—链表带环问题
1.判断一个单链表是否带环 思路解析: 判断一个单链表是不是带环,就看在遍历单链表的时候能不能遍历完成,如果带环的话会陷入死循环程序一直无法结束,但是这种判断方法在程序的实现是不可能的.所以转换一种思 ...
- 链表带环问题及相遇点问题
带环问题 基本思路: 快慢指针,慢指针走一步,快指针走两步,如果链表带环,则快指针先进入环内,并且两节点必在环内相遇. 扩展问题: 当快指针一次性走3,4...,n步是否可以. 假设指针内环为两个结点 ...
- 链表带环问题(详解)
- 【神秘海域】[动图] 结合题目-手把手带你剖析 “带环链表”
文章目录 引言 带环单链表之前 : 快慢指针 题1:单链表的中间结点 题2:链表中倒数最后k个结点 带环链表分析 题:环形链表 带环链表的问题 ⭐带环链表深入分析⭐ * 问题1 问题2 问题3 题:寻 ...
- LeetCode 142. 环形链表 II(链表环的检测)
文章目录 1. 题目链接 2. 解题 1. 题目链接 给定一个链表,返回链表开始入环的第一个节点. 如果链表无环,则返回 null. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链 ...
- LeetCode 141.带环问题(判断是否带环) 142.带环问题(返回入环点)
目录: 1.带环问题(判断是否带环) (1)题目描述 (2)思路解析 a.问题: 怎么证明快指针和慢指针一定会在环里相遇,而不是一直错过? b.问题:如果slow一次走一步,fast一次走3步?fas ...
- LeetCode 142. 环形链表 II(Linked List Cycle II)
142. 环形链表 II 142. Linked List Cycle II 题目描述 给定一个链表,返回链表开始入环的第一个节点.如果链表无环,则返回 null. 为了表示给定链表中的环,我们使用整 ...
最新文章
- Speed4Web 绿色纯净版
- linux文本编辑器vim的基本使用
- TortoiseSVN找不到系统指定路径
- Divide Two Integers
- EXTjs grid与json数据 转载
- tf里面InteractivateSession()与Session()的区别
- qt 文件 时间 倒序排列_win7电脑敬业签便签软件分类标签里的内容如何按提醒时间排列?...
- indices should be one-based and in ascending order
- note同步不及时 one_朱海舟回应锤子便签同步不及时:工程师已经解决
- 【NOI2013】快餐店【基环树】【树的直径】【set】
- windows如何生成ssh密钥
- p1、查询端口号占用,根据端口查看进程信息/p
- 全方位打造最强终端(iterm2 + oh my zsh)
- pycharm 安装PYQ5以及no Qt platform plugin could be initialized的问题
- 适用于苹果Mac的 5 个 SSH 客户端软件
- 关于SUSE linux
- 【好玩的代码雨(附源代码)】
- windows打流工具IxChariot使用教程
- java applet init_java Applet中init方法
- winhex使用简介
热门文章
- hadoop启动主机名解析错误解决
- 关于thrift的使用
- 双击 计算机 网络打不开,win10系统双击“计算机”打不开的处理步骤
- android 仿美团骑手地图_Android仿美团外卖菜单界面
- 中国人民大学计算机取证,重邮举办全国计算机取证技术研讨会暨全国电子数据取证与司法鉴定挑战赛...
- python3爬虫模拟登录爬取教务系统成绩单(获取cookie操作)
- HTML5移动的代码,HTML_HTML5实现一个能够移动的小坦克示例代码,复制代码代码如下: !DOCTYPE h - phpStudy...
- 2021-10-14每日一练
- NLP中的卷积操作详解(torch.nn.Conv1d)
- centos dnf命令原始源安装mysql成功案例