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