力扣--环形链表--C语言

需要注意:环形链表不是循环链表,但循环链表是一种环形链表。(百度和字节喜欢考

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
bool hasCycle(struct ListNode *head) {
    struct ListNode* slow=head,*fast=head;
    while(fast && fast->next!=NULL)
    {
        slow=slow->next;
        fast=fast->next->next;

        if(slow=fast)
        return true;

    }
    return false;
    
}

相遇问题:需要用到快慢指针

 结论:

1.slow一次走一步,fast一次走两步,一定能追得上:

假设slow进环,fast开始追,假设slow与fast的距离为N,追的过程中,他们之间的距离变化:

N;

N-1;

N-2

...

1

0(相遇)

故fast追slow时,每走一步,距离缩小1,距离是0时,他们相遇。

2.slow一次走一步,fast一次走3步,可能不能相遇:

先假设进环后,slow与fast的距离相差N,slow走一步,fast走三步,距离相差N-2

N

N-2

N-4

....

0/-1

N偶数时0(fast与slow相遇)/, N为奇数时-1(fast超过slow1步,错过,则进入新的追逐,他们之间的距离是C-1,C是环的长度).

如果C-1是偶数,就能追得上,如果C-1是奇数,就永远追不上。(距离是奇数时,快追上时,结果为-1,则fast反超slow)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值