142. Linked List Cycle II

每日一题 2019 - 05 - 08

题目:

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
2
3
Input: head = [3,2,0,-4], pos = 1
Output: tail connects to node index 1
Explanation: There is a cycle in the linked list, where tail connects to the second node.

img

Example 2:

1
2
3
Input: head = [1,2], pos = 0
Output: tail connects to node index 0
Explanation: There is a cycle in the linked list, where tail connects to the first node.

img

Example 3:

1
2
3
Input: head = [1], pos = -1
Output: no cycle
Explanation: There is no cycle in the linked list.

img

Follow up:
Can you solve it without using extra space?


解法:

这个题让找出链表存在的环的入口,思路十分的巧妙,也即通过快慢双指针法进行求解,快指针每次运动两步,慢指针每次运行一步,当快慢指针相遇时候,此时慢指针到达入口的距离一定等于链表起始点到达入口的距离(这里是有严格的数学推导的),此时再从链表头部设置一个指针开始追赶慢指针,一定就能找到入口所在;


代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *detectCycle(ListNode *head) {
ListNode *fast = head ;
ListNode *low = head ;
ListNode *first = head ;
if(head == NULL)
{
return NULL ;
}
ListNode *temp = head ;
int i = 0 ;
while(temp)
{
temp = temp -> next ;
i ++ ;
if(i > 2)
{
break ;
}
}
if(i == 1)
{
return NULL ;
}
while(fast -> next != NULL && fast -> next -> next != NULL)
{
fast = fast -> next -> next ;
low = low -> next ;
if(fast == low)
{
while(first != low)
{
first = first -> next ;
low = low -> next ;
}
return first ;
}
}
return NULL ;
}
};
0%
undefined