LeetCode 142.环形链表II
思路
主要考察两点:
1、判断链表是否有环
2、若有环,如何确定环的入口
判断链表是否有环:
利用快慢指针法。定义fast指针和slow指针并都指向头结点,fast指针每次移动两个结点,slow指针每次移动一个结点,循环判断fast指针是否等于slow,当二者相等时,则表示链表存在环。
确定环的入口结点:
当fast指针等于slow指针时,定义一个临时结点tmp1,用于记录fast和slow相遇时的结点,并再定义一个临时结点tmp2,指向链表头结点,循环判断tmp1是否等于tmp2,若不相等则tmp1与tmp2向前移动一个结点,直到二者相等时,返回其中一个结点即为环的入口结点。
代码
class Solution {
public:
ListNode *detectCycle(ListNode *head) {
ListNode *slow = head;
ListNode *fast = head;
while(fast != nullptr && fast->next != nullptr){
slow = slow->next;
fast = fast->next->next;
// 快慢指针相遇
if(slow == fast){
ListNode *tmp1 = fast;
ListNode *tmp2 = head;
while(tmp1 != tmp2){
tmp1 = tmp1->next;
tmp2 = tmp2->next;
}
return tmp1; // 返回环的入口结点
}
}
return nullptr;
}
};
具体理论推导,参考代码随想录