剑指 offer 面试题 23 链表中环的入口节点(快慢指针)

链表中环的入口节点

个人博客

一个链表中包含环,请找出该链表的环的入口结点。

题解
  • lowB 解法
    • 将链表中的元素加入到 hashmap 中,遍历链表,发现节点已经存在 hashmap 中则说明是入口节点
  • 快慢指针
    • 无环情况
    • 设置快慢指针,慢的步长为 1,快的步长为 2
    • 如果链表有环,则快指针一定能追上慢指针
      • 因为快指针相对于满指针的步长为 1,如果环长为 n,则一定能重新与满指针相遇(重点是相对速度)
      • 如链表无环,则快指针指向 null 时刻返回 null
    • 当快指针追上慢指针时,其中一指针停止,一指针以步长为 1的速度前进,直到再次与停止的指针相遇,记录走过的长度。此长度即为环长 n。
    • 此时,两个指针回到头结点,一个指针先走 n 步,然后两个指针以相同的速度前进,两指针相遇的地方就是环的入口节点。
    • leetcode 没有这道题,就偷懒了
总结
  • 注意链表无环的情况,提高代码的鲁棒性
  • 链表只有一个节点的情况
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值