题目描述:给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。
方法1:使用unordered_set
class Solution {
public:
ListNode *detectCycle(ListNode *head) {
unordered_set<ListNode*> set;
while(head){
if(set.count(head)) return head;
set.emplace(head);
head = head->next;
}
return NULL;
}
};
方法2:慢指针每次移动一步,快指针每次移动两步,如果有环最后一定会相遇
设快指针走n圈,慢指针走t圈
相遇后,将快指针指向头指针,快慢指针每次同时走一步,再相遇即为入环的第一个节点
class Solution {
public:
ListNode *detectCycle(ListNode *head) {
if(!head || !head->next) return NULL;
ListNode *p = head;
ListNode *q = head;
while(q && q->next){
p = p->next;
q = q->next->next;
if(p == q){
q = head;
while(p != q){
p = p->next;
q = q->next;
}
return p;
}
}
return NULL;
}
};