判断环形链表的起点(java语言)Leetcode 142题

Leetcode 142题 判断环形链表的起点

在这里我们是使用快慢指针 (双指针) 的方式来解决此问题。

​ 我们设置一个慢指针指向头结点,快指针指向头结点,快指针每次走两步,慢指针每次走一步。如果不存在环,快指针最终会指向null;如果存在环,两者最终必定在环中的某一点相遇。这是一个数学中的追击问题,两个运动员在环形跑道上匀速跑步,一个快,一个慢,慢的一方一定会被快的一方在一定时间内追上。(题外话,该论证是一个小学问题,但是我还是思考了很久,只能说智商多少沾点),所以我们得到如何判断链表中是否存在环的条件,即快慢指针最终相遇。

​ 有了判断是否存在环的条件,接下来我们在来探讨一个问题,那就是如何找到链表中环的起点。我们假设:

将带环链表拆分成一个单链和一个环,结构如下图:

​ 单链的长度为a,环的长度为c,两者在环中的c点相遇,注意,这个c点是距离环的起点的单圈距离。

​ 设慢指针走的路程为s,快指针走的路程是f,这里是路程,不是距离或者是位移。快指针在环上走了m圈,慢指针在环上走了n圈,所以我们能够得出:

s = a + n * b + c

f = a + m * b + c

​ 同时,因为快指针每次走两步,慢指针每次走一步,两者最终相遇,那么我们可以得出: f = 2 s;

所以我们能够得出 :a + m * b + c = 2 * ( a + n * b + c)

​ 化简得 :a + c = (m - 2n) * b

​ 即 :a + c 是 b 的整数倍,即我们从c点出发,走a步会到达环头,可能走了很多圈。(一个指针先从环的起点开始走c步,再走a步 == 另一个指针从环的起点走(m - 2n) 圈)

所以我们在两个快慢指针第一次相遇的时候,将慢指针再次指向头结点,快指针指向相遇的结点,两者以同样的速度(一步)前进,直至相遇,则环的起点找到。

以下是代码:java版本

public ListNode detectCycle(ListNode head) {ListNode slow = head;ListNode fast = head;//证明有环的方法(当然我们也可以不使用快慢指针判断是否存在环)while (fast != null && fast.next != null) {fast = fast.next.next;slow = slow.next;if (fast == slow) {break;}}//head为空或者head只有一个结点的情况if (fast == null || fast.next == null) {// fast 遇到空指针说明没有环return null;}// 慢指针重新指向头结点slow = head;// 快慢指针以相同的速率前进,直到相遇while (slow != fast) {fast = fast.next;slow = slow.next;}return slow;}

本人刷题心得,如有错误和冒犯,欢迎指正。

使用java判断环形链表的起点,Leetcode 142题相关推荐

  1. java环形链表_数据结构和算法(四)Java实现环形链表

    1. 数据结构和算法(四)Java实现环形链表 1.1 约瑟夫问题 约瑟夫问题:公元66年,约瑟夫不情愿地参与领导了犹太同胞反抗罗马统治的起义,后来起义失败,他和一些宁死不降的起义者被困于一个山洞之中 ...

  2. java实现环形链表解决约瑟夫环问题

    什么是环形链表? 环形链表就是单向链表的基础上让链表的首尾相连,形成一个环,这就是一个循环链表. 什么是约瑟夫环问题? 约瑟夫环如下: 约瑟夫问题是个著名的问题:N个人围成一圈,第一个人从1开始报数, ...

  3. 【Java】环形链表 ( 给定一个链表,判断链表中是否有环)

    题目描述 :给你一个链表的头节点 head ,判断链表中是否有环. 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环. 为了表示给定链表中的环,评测系统内部使用整数 po ...

  4. Java判断单链表是否有环的两种实现方法

    http://blog.jobbole.com/106227/ 方法一:首先从头节点开始,依次遍历单链表的每一个节点.每遍历到一个新节点,就从头节点重新遍历新节点之前的所有节点,用新节点ID和此节点之 ...

  5. (链表)Java 求解环形链表 II

    文章目录 一.题目 二.题目分析 三.代码 四.总结 一.题目 给定一个链表,返回链表开始入环的第一个节点. 如果链表无环,则返回 null. 为了表示给定链表中的环,我们使用整数 pos 来表示链表 ...

  6. java实现翻转二叉树_【leetcode刷题】[简单]226. 翻转二叉树(invert binary tree)-java...

    翻转二叉树 invert binary tree 题目 翻转一棵二叉树. 示例: 输入: 4 / \ 2 7 / \ / \ 1 3 6 9 输出: 4 / \ 7 2 / \ / \ 9 6 3 1 ...

  7. 【力扣-141】 环形链表 + 【力扣-142】 环形链表 II

  8. 【LeetCode】详解环形链表141. Linked List Cycle Given a linked list, determine if it has a cycle in it. To

    文章目录 前言 正文 原题: 思路1: 思路2 思路3 总结 前言 今天这道题目的第一种解法很奇葩,用计时器竟然可以AC,并且可以自己调整时间多少,跟我一起来看看吧. 正文 原题: 链接:环形链表 G ...

  9. java模拟单链表环形链表解决约瑟夫问题

    java模拟环形链表解决约瑟夫问题 此文是观看尚硅谷韩老师的数据结构与算法学习视频整理的笔记 约瑟夫问题描述 约瑟夫问题(有时也称为约瑟夫斯置换,是一个出现在计算机科学和数学中的问题.在计算机编程的算 ...

最新文章

  1. pytorch 状态字典:state_dict 模型和参数保存
  2. 2022-2028年中国光刻机行业深度调研及投资前景预测报告
  3. cad打印样式ctb丢失_CAD制图软件中如何设置CAD打印样式表(CTB)?
  4. 浅析网页界面设计——首页设计
  5. python求素数算法_Python程序最多可计算n个质数(使用不同算法)
  6. Linux下进程隐藏的常见手法及侦测手段
  7. python制作饼状图
  8. Sphinx——自动生成Python文档
  9. 再探.NET的PE文件结构(安全篇)
  10. 兄弟节点div, +~选择器不能向前选择
  11. 内网穿透小知识|什么是端口映射?端口映射使用操作指南
  12. 上预算管理软件,不如上EXCEL
  13. 淘宝京东拼多多自动查券找券返利机器人实现方法分享
  14. 水木周平戏说中国网络黑幽默!
  15. java输入 以逗号隔开_要求做个java程序用户输入数字逗号隔开, 计算下面的公式 多谢了...
  16. 关于应用服务器和数据库服务器的区别浅谈
  17. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?
  18. 洋葱架构简介——分离是为了更好的结合
  19. 菜鸟教程之html5学习,Canvas画布、渐变,数学公式、符号的书写
  20. Windows域提权漏洞CVE-2021-442287

热门文章

  1. Linux大杂烩(扩展)
  2. html+js画一颗心形,javascript绘制漂亮的心型线效果完整实例
  3. 近红外 CMOS 相机
  4. 第11节 三个败家子(11)——女王与甄妃
  5. DHCP静态绑定和ARP静态绑定
  6. (二十四)优秀员工 - 8
  7. Screen Shots For OftenTap v1.0.0
  8. html、css画太阳
  9. 【Python 小白到精通 | 课程笔记】第二章:图灵和恩尼格马密码机2(文本分析)
  10. web漏洞开始,sql注入