链表中环的入口问题

  • 1、题目描述
  • 2、题目解析
  • 3、代码

1、题目描述

给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。

2、题目解析

先放一份解析:
leetcode解析
这个居然是英文版的网站…

正式解析(我参考的):
1、这题我们可以采用双指针解法,一快一慢指针。快指针每次跑两个element,慢指针每次跑一个。如果存在一个圈,总有一天,快指针是能追上慢指针的。
2、如下图所示,我们先找到快慢指针相遇的点,p。我们再假设,环的入口在点q,从头节点到点q距离为A,q p两点间距离为B,p q两点间距离为C。
3、因为快指针是慢指针的两倍速,且他们在p点相遇,则我们可以得到等式 2(A+B) = A+B+C+B. (感谢评论区大佬们的改正,此处应为:如果环前面的链表很长,而环短,那么快指针进入环以后可能转了好几圈(假设为n圈)才和慢指针相遇。但无论如何,慢指针在进入环的第一圈的时候就会和快的相遇。等式应更正为 2(A+B)= A+ nB + (n-1)C)
4、由3的等式,我们可得,C = A。(这里我不是很懂,为啥一定相等???\color{red}{这里我不是很懂,为啥一定相等???}这里我不是很懂,为啥一定相等???)
5、这时,因为我们的slow指针已经在p,我们可以新建一个另外的指针,slow2,让他从头节点开始走,每次只走下一个,原slow指针继续保持原来的走法,和slow2同样,每次只走下一个。
6、我们期待着slow2和原slow指针的相遇,因为我们知道A=C,所以当他们相遇的点,一定是q了。
7、我们返回slow2或者slow任意一个节点即可,因为此刻他们指向的是同一个节点,即环的起始点:q。

3、代码

/*public class ListNode {int val;ListNode next = null;ListNode(int val) {this.val = val;}
}
*/
public class Solution {public ListNode EntryNodeOfLoop(ListNode pHead){if(pHead ==null ||pHead.next == null){return null;}ListNode fast = pHead;ListNode slow = pHead;while(fast!=null && fast.next!=null){fast = fast.next.next;slow = slow.next;if(fast == slow){ListNode slow2 = pHead;while(slow2 != slow){slow2 = slow2.next;slow = slow.next;}return slow2;}}return null;   }
}

最后返回的第二个慢指针,结合图片很好理解的。

剑指Offer之寻找链表中环的入口问题相关推荐

  1. 【双100%解法】LeetCode 141 【剑指Offer 23】链表中环的入口节点

    立志用最少的代码做最高效的表达 给定一个链表,判断链表中是否有环. 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环. 为了表示给定链表中的环,我们使用整数 pos 来表 ...

  2. 【Java】剑指 Offer II 022. 链表中环的入口节点

    题目 :给定一个链表,返回链表开始入环的第一个节点. 从链表的头节点开始沿着 next 指针进入环的第一个节点为环的入口节点.如果链表无环,则返回 null. 为了表示给定链表中的环,我们使用整数 p ...

  3. 剑指 Offer II 022. 链表中环的入口节点(力扣剑指Offer专项突击版——链表2)

    题目 给定一个链表,返回链表开始入环的第一个节点. 从链表的头节点开始沿着 next 指针进入环的第一个节点为环的入口节点.如果链表无环,则返回 null. 为了表示给定链表中的环,我们使用整数 po ...

  4. 剑指Offer之寻找链表倒数第k个节点

    题目描述 输入一个链表,输出该链表中倒数第k个结点. 代码及解析 用的快慢指针的思路 public class FindKthValue {static public class ListNode { ...

  5. 《LeetCode力扣练习》剑指 Offer 24. 反转链表 Java

    <LeetCode力扣练习>剑指 Offer 24. 反转链表 Java 一.资源 题目: 定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点. 示例: 输入: 1-& ...

  6. 剑指Offer:反转链表【24】

    剑指Offer:反转链表[24] 题目描述 输入一个链表,反转链表后,输出新链表的表头. 解题分析 这道题我才发现我是属于那种真的笨,图都画出来了流程写不出来.看了别人的代码,总觉得自己差一步. 这也 ...

  7. 剑指offer之找到链表里面包含环的入口节点

    1 问题 剑指offer之找到链表里面包含环的入口节点,比如 // node7<-node6 <-node5// | |//head->node1->node2->nod ...

  8. 【LeetCode】剑指 Offer 35. 复杂链表的复制

    [LeetCode]剑指 Offer 35. 复杂链表的复制 文章目录 [LeetCode]剑指 Offer 35. 复杂链表的复制 package offer;import java.util.Ar ...

  9. 【LeetCode】剑指 Offer 18. 删除链表的节点

    [LeetCode]剑指 Offer 18. 删除链表的节点 文章目录 [LeetCode]剑指 Offer 18. 删除链表的节点 一.双指针 一.双指针 本题删除值为 val 的结点需分为两步: ...

最新文章

  1. 基础数据类型之集合和深浅copy,还有一些数据类型补充
  2. 判断非负整数是否是3的倍数_二、因数与倍数教案
  3. 哈理工大学计算机专业宿舍,计算机学院举办“灯塔工程”之寝室文化节
  4. vue-快速原型开发
  5. Redis 数据库入门教程
  6. 3分钟让你轻松了解CRM
  7. 京东股价创新高:市值首次突破千亿美元 !
  8. 设计模式七: 策略(Strategy)
  9. 在webstorm中新建模板
  10. uctf-杂项题目分析
  11. ios uiwindow弹窗_iOS-UIWindow详解
  12. android fake gps,假GPS定位(Fake GPS Position) v4.5 安卓版
  13. Taro使用wxParse富文本组件
  14. 将Windows10中的C盘desktop移到D盘
  15. Vim,人类史上最好用的文本编辑器!从此以后你就是一个善良的极客!
  16. D. Binary Spiders(dpTrie)
  17. pytorch_geometric(pyg)复现T-GCN
  18. xpdf工具(PDF转图片工具)
  19. python画羊_python编程羊车门问题代码示例
  20. 持续爆点:一对一直播和短视频

热门文章

  1. php酒店管理论文,酒店管理毕业论文
  2. coreldraw登录老是出现未知错误_原神:新版本bug频出,史莱姆消失,联机模式提示506错误码...
  3. 安卓马赛克view_Android马赛克效果MosaicView
  4. 软件工程导论 01章软件工程学概述
  5. 第 20 次 CSP认证 202009-3 点亮数字人生
  6. Anaconda——conda换源可以直接通过conda命令来实现
  7. pip 安装 rdkit
  8. 计算N个点和M个点之间的距离
  9. leetcode944. Delete Columns to Make Sorted
  10. 【oracle】除数为0