LeetCode 142 环形链表II 题解
一、题型归类
双指针
二、思路
1.分析题目
1.要确定链表是否有环,可以利用快慢指针的特性来处理本题,设置一个快指针,一个慢指针,利用数学知识推导可知,若有环,则快慢指针必定会相遇。若无环则快指针必会走到为空的时候。
2.确定有环,则将两个指针的速度调为一致,把快指针调回表头,最终相遇节点即为环的初始起点。
2.代码如下
/**
* 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 *slow=head,*fast=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 slow;
}
};
总结
**总结分析:**快慢指针是常见的处理链表的环路问题的套路,要学会题型归类