LeetCode 142 | 环形链表 II
题目
题解
- 用哈希表:
访问过的结点都放在哈希表里,每次访问结点前检查结点是否在里面,如果在那么该返回的就是这个节点了。
/**
* 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) {
set<ListNode*> s;
auto p=head;
while(p){
if(s.count(p))return p;
else{
s.insert(p);
p=p->next;
}
}
return nullptr;
}
};
- 数学:
这就要推演一下规律,下面是来自leetcode官方的图片
代码:
/**
* 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) {
if(!head)return nullptr;
auto low=head;
auto fast=head;
do{
low=low->next;//走一步
//fast这么写是因为,可能fast->next=nullptr
fast=fast->next;//走两步
if(fast)fast=fast->next;
if(fast==low)break;
}while(low&&fast);
if(!low||!fast)return nullptr;//检查是否有环
auto ptr=head;
while(ptr!=low){//ptr和low最终会在入口相遇
ptr=ptr->next;
low=low->next;
}
return low;
}
};