File tree 1 file changed +3
-4
lines changed
solution/142.Linked List Cycle II
1 file changed +3
-4
lines changed Original file line number Diff line number Diff line change 3
3
4
4
给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 ` null ` 。
5
5
6
- ** 说明:** 不允许修改给定的链表。
6
+ ** 说明:** 不允许修改给定的链表。
7
7
8
8
** 进阶:**
9
9
你是否可以不用额外空间解决此题?
10
10
11
11
### 解法
12
12
13
- 利用快慢指针,若快指针为 ` null ` ,则不存在环, 若快慢指针相遇,则存在环,此时退出循环,利用 ` p1 ` 指向链表头结点,` p2 ` 指向快慢指针相遇点,` p1 ` , ` p2 ` 同时前进,相遇时即为入环的第一个节点 。
13
+ 利用快慢指针,若快指针为 ` null ` ,则不存在环; 若快慢指针相遇,则存在环,此时退出循环,利用 ` p1 ` 指向链表头结点,` p2 ` 指向快慢指针相遇点,随后 ` p1 ` , ` p2 ` 同时前进,相遇时( ` p1 == p2 ` )即为入环的第一个节点 。
14
14
15
15
** 证明如下:**
16
16
17
17
![ solution142-slow-fast.png] ( http://p9ucdlghd.bkt.clouddn.com/solution142-slow-fast.png )
18
18
19
- 假设链表到入环点距离为 ` a ` ,入环点到快慢指针相遇点距离为 ` b ` ,慢指针行程为` s ` ,快指针行程是它的 2 倍,相遇时快指针比慢指针多走了 ` n * r ` 圈,即 ` 2s ` 。则:
19
+ 假设链表到入环点距离为 ` a ` ,入环点到快慢指针相遇点距离为 ` b ` ,慢指针行程为` s ` ,快指针行程是它的 2 倍,即 ` 2s ` 。 相遇时快指针比慢指针多走了 ` n * r ` 圈 。则:
20
20
```
21
21
① a + b = s
22
22
② 2s - s = n * r
28
28
29
29
` p1 ` , ` p2 ` 同时向前走 ` r - b ` ,` p2 ` 到达入环点,而 ` p1 ` 距离入环点还有 ` (n - 1) * r ` ,双方同时走 ` (n - 1) ` 圈即可相遇,此时相遇点就是入环点!
30
30
31
-
32
31
``` java
33
32
/**
34
33
* Definition for singly-linked list.
You can’t perform that action at this time.
0 commit comments