环形链表:
1 判断是否有环:一个fast 一个slow fast要多走两步 slow一次走一步;相当于 fast一直在追赶slow 最终会相遇的
2 在有环后判断入口,假设从起点到环的入口为x,环入口到两人相遇为y,相遇再回到环入口为z,这样得到公式 用x表示后 由于y不知道绕了几圈环才遇到x,假设绕了0圈 那么发现x=z
意思就是两人相遇后再派两个指针 一个从开始的地方一个从相遇的地方 同时一步一个脚印 再次重演相遇场景 得到环的入口
错在:一开始设置fast=head->next. slow = head 一开始就不相遇
以及
if(head==nullptr || head->next == nullptr) return nullptr;
while(fast->next && fast->next->next) //所以这样刚开始不能slow!=fast
我写的代码
绕出时间限制
判断都为slow!=fast
设置slow==fast在这个分支条件下while
class Solution {
public:
ListNode *detectCycle(ListNode *head) {
if(head==NULL || head->next==NULL)return NULL;
ListNode* slow = head;
ListNode* fast = head;
ListNode* q = head;
while(fast->next && fast->next->next)
{
fast=fast->next->next;
slow = slow->next;
if(slow == fast)
{
while(q!=fast)
{
q=q->next;
fast=fast->next;
}
return fast;
}
}
return NULL;
}
};