题目描述
给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。
不允许修改 链表。
cpp
class Solution {
public:
ListNode *detectCycle(ListNode *head) {
ListNode *fast = head;
ListNode *slow = head;
while (fast) {
slow = slow->next;
if(fast->next){
fast = fast->next->next;
}else{
return nullptr; //处理边界值
}
if (fast == slow) {
break;
}
}
if(fast!=slow)
return nullptr;
fast = head;
while (fast != slow) {
fast = fast->next;
slow = slow->next;
}
return slow;
}
};
小结:这道题在上一道题的基础上,不仅要判断是否有环,还要返回入环结点
a+(n+1)b+nc=2(a+b)⟹a=c+(n−1)(b+c)
根据图示推导出这个公式,之后让快指针回到起点,并和慢指针以同样的速度移动,会发现快指针走距离a的时候,慢指针正好走距离c+(n-1)圈,即快慢指针在入环点相遇。需要注意的是本题有一个边界样例,只有一个结点且没有环,需要额外判断一下。