leetcode 环形链表

力扣

环形链表:

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;





 

}

};


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值