题目
给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null
。
为了表示给定链表中的环,我们使用整数 pos
来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos
是 -1
,则在该链表中没有环。
说明:不允许修改给定的链表。
示例 1:
1 | 输入:head = [3,2,0,-4], pos = 1 |
示例 2:
1 | 输入:head = [1,2], pos = 0 |
示例 3:
1 | 输入:head = [1], pos = -1 |
进阶:
你是否可以不用额外空间解决此题?
Given a linked list, return the node where the cycle begins. If there is no cycle, return null
.
To represent a cycle in the given linked list, we use an integer pos
which represents the position (0-indexed) in the linked list where tail connects to. If pos
is -1
, then there is no cycle in the linked list.
Note: Do not modify the linked list.
Example 1:
1 | Input: head = [3,2,0,-4], pos = 1 |
Example 2:
1 | Input: head = [1,2], pos = 0 |
Example 3:
1 | Input: head = [1], pos = -1 |
Follow up:
Can you solve it without using extra space?
解题方法
先使用快慢指针fast
、slow
判断链表是否有环,无环返回Null
;
有环,假设链表起点为H
环的入口节点为I
,快慢指针相遇节点为M
,H
到I
的距离为a
,I
到M
的距离为b
,环的长度为l
。
快指针fast
比慢指针slow
多跑一圈,即a+b=l
。又因为环入口I
到相遇节点M
的距离为b
,所以相遇节点M
到环入口I
的距离也为a
,即链表起点H
到环入口节点I
的距离。(建议画下图很容易看出来)
所以此时快指针fast
和链表起点p
同时出发,相遇节点即环入口节点。这段代码跑了1ms,超过了98.32%的Java提交。
1 | /** |