题目链接

142. 环形链表 II - 力扣(LeetCode)

题目描述

给定一个链表,如果链表有环,则返回链表开始入环的第一个节点,如果没有环,返回null

输入输出样例

1
2
3
输入:head = [3,2,0,-4], pos = 1
输出:返回索引为 1 的链表节点
解释:链表中有一个环,其尾部连接到第二个节点。

题目解释

快慢指针

代码

个人实现

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
// 快慢指针
class Solution {
public:
ListNode* detectCycle(ListNode* head) {
ListNode *fast = head, *slow = head;
// 先执行循环后结束判断,防止传入数据为空指针
do {
// 如果快指针到达结尾
if (!fast || !fast->next)
return nullptr;
fast = fast->next->next;
slow = slow->next;
} while (fast != slow);

fast = head;
while (fast != slow) {
slow = slow->next;
fast = fast->next;
}
return fast;
}
};




官方实现

作者:力扣官方题解
链接:https://leetcode.cn/problems/linked-list-cycle-ii/solutions/441131/huan-xing-lian-biao-ii-by-leetcode-solution

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 哈希
class Solution {
public:
ListNode *detectCycle(ListNode *head) {
unordered_set<ListNode *> visited;
while (head != nullptr) {
if (visited.count(head)) {
return head;
}
visited.insert(head);
head = head->next;
}
return nullptr;
}
};