环&快慢指针

  • 前言
  • 一、环形链表
  • 二、快慢指针
    • 1、相遇即有环
    • 2、入环点
  • 总结
  • 参考文献

前言

对于环问题,快慢指针是一种常用的手段。一步两步走,通过判定是否相遇来判定是否存在环。而且快慢指针还能轻松的求到入环点。

一、环形链表

二、快慢指针

1、相遇即有环

/*** Definition for singly-linked list.* class ListNode {*     int val;*     ListNode next;*     ListNode(int x) {*         val = x;*         next = null;*     }* }*/
public class Solution {/*对于环问题,可采用快慢指针进行判定。快慢指针:慢指针走一步,快指针走两步,有环则两者相等,无环则快指针先到null。*/public boolean hasCycle(ListNode head) {if(null == head) return false;ListNode slow = head,fast = head.next;while(slow != fast && fast != null){slow = slow.next;fast = fast.next;if(fast != null) fast = fast.next;}return fast == slow;}// 如果存在环,求入环节点怎么办?/*设起点到入环点的距离为a;设入环点到相遇点的距离为b;由于快指针是慢指针的2倍,所以除了快指针走的a+b,还剩a + b = k * L(L为环的长度,k为常数。);从环点走到相遇点,已经走了b了,再走距离为a时,共走了a+b=kL,则走了k圈回到起点。而起点到环点的距离也为a,所以从起点走到环点时,快指针也经走了k圈回到环点,两者相遇,得到环点。*/
}

2、入环点

设起点到入环点的距离为a;设入环点到相遇点的距离为b;

由于快指针是慢指针的2倍,所以除了快指针走的a+b,还剩a + b = k * L(L为环的长度,k为常数。);

从环点走到相遇点,已经走了b了,再走距离为a时,共走了a+b=kL,则走了k圈回到起点。

而起点到环点的距离也为a,所以从起点走到环点时,快指针也经走了k圈回到环点,两者相遇,得到入环点。

总结

1)对于环问题,可采用快慢指针的相遇来判定是否存在环。

2)快慢指针不仅用于判定环,在对链表进行归并排序时,还可以取到链表的中点。

3)对于环入口问题,可再从起点行走,再次和快指针相遇时,则是入环点。

参考文献

[1] LeetCode 环形链表

环形链表[快慢指针 入环点]相关推荐

  1. 一文学会链表快慢指针解题技巧

    前言 上文 我们详细地学习了链表的基本概念,优缺点,也带大家一步步由浅入深地学习了链表的翻转技巧,这一篇我们来看看链表的另一个解题技巧:快慢指针. 快慢指针在面试中出现的概率也很大,也是务必要掌握的一 ...

  2. 动画:链表快慢指针解题技巧

    点击蓝色"五分钟学算法"关注我哟 加个"星标",天天中午 12:15,一起学算法 作者 | 码海 前言 这一篇我们来看看链表的另一个解题技巧:快慢指针. 快慢指 ...

  3. 008.环形链表 II-双指针

    题目链接:力扣 代码: class Solution { public:ListNode *detectCycle(ListNode *head) {ListNode* fast = head;Lis ...

  4. 快慢指针求环入口问题:

    1. 是否存在环: 在寻找环入口之前,我们需要先判断是否存在环.判断的方式有很多,经典的方法就是快慢指针.所谓快慢指针,就是用两个指针,一个每次只移动一步,一个每次移动两步,移动块的指针我们称之为快指 ...

  5. java单链表快慢指针

    例题: LeetCode876. 链表的中间结点 /*** Definition for singly-linked list.* public class ListNode {* int val;* ...

  6. LeetCode 2130. 链表最大孪生和(链表快慢指针+反转链表+双指针)

    文章目录 1. 题目 2. 解题 1. 题目 在一个大小为 n 且 n 为 偶数 的链表中,对于 0 <= i <= (n / 2) - 1 的 i ,第 i 个节点(下标从 0 开始)的 ...

  7. 46 - 算法 -Leetcode-141-环形链表-快慢指针

    * 快慢指针法:设定两个指针,如果快指针被慢指针追上,那么一定有环*/ class Solution {public:bool hasCycle(ListNode *head) {ListNode * ...

  8. 尝试证明快慢指针可以相遇问题 以及 证明入环点问题

    预热 引用题目:环形链表 快慢指针解法: class Solution {public boolean hasCycle(ListNode head) {if(head == null) {retur ...

  9. 算法基础--快慢指针

    快慢指针 快慢指针就是用一快一慢两个指针来遍历数据对象并解决问题,常用于解决例如2倍速来求中间指针或判断循环链表.恒定n个差值或用于寻找倒数第n个指针等问题. 1.环形链表 快慢指针的经典应用场景就是 ...

最新文章

  1. linux连接小米随身wifi密码忘记了,小米wifi管理员密码忘记了怎么办?
  2. 项目添加JWT工具类
  3. HDU - 2973威尔逊定理
  4. js实现右键单击打开自定义的菜单
  5. java2019 数据结构算法面试题_2019年JVM最新面试题,必须收藏它
  6. 四个小时不止是敲了30多行代码,还懂了好多
  7. [VNC] 云服务器 Ubuntu 16.04 安装 gnome 桌面并配置 VNC
  8. Segmentation-Driven 6D Object Pose Estimation论文详解
  9. VVC代码阅读(2)compressGOP函数(1)
  10. 员工转正述职答辩问什么问题_转正答辩会问什么问题?
  11. 假期培训第一阶段的总结和第二阶段的总结
  12. 如何在VR全景中嵌入AI数字人功能?打造云端体验感
  13. 递归算法的时间&空间复杂度!
  14. ASP的2种开发模式
  15. 增强子调控法则被揭示:序列不同,但可以在不同物种起相似功能
  16. C语言 二分查找(循环实现)
  17. win7 64位 安装tensorflow GPU版本
  18. 在控制面板,管理工具找不到Internet 信息服务
  19. 文献综述 笔记软件_论坛软件综述
  20. 便捷式备份系统并还原

热门文章

  1. 杂项-VOD:VOD(视频点播)
  2. 快乐学算法之:三分查找树ternary search tree
  3. Jquery页面滚动条向下拉到div的位置时,此div就固定在顶部,向上拉时返回原位置
  4. 计算机硬盘休眠更改,win7不让硬盘进入休眠状态的方法步骤
  5. 【Java案例】超市购物
  6. 深入理解C++11 读书笔记(三) 通用与专用
  7. MQ消息的自动应答和手动应答| RabbitMQ系列(三)
  8. ABAP: 今天是星期几?
  9. 【常用form表单】
  10. 数学建模之灰色预测(GM1.1)