环形链表(是否成环)(简单)(证明题)

 环形链表(是否成环)(简单)(证明题)

141. 环形链表 - 力扣(LeetCode)

题目

解题思路

1,我们把判断问题,用快慢指针搞成追击问题

2,找到环形链表里面的相交节点,所以我们设立快慢指针

  • slowfast
  • 所以2slow=fast
  • 所以slow=slow->next;
  • 所以fast=fast->next->next;

代码

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
 //如果链表中存在环 ,则返回 true 。 否则,返回 false 。
typedef struct ListNode ListNode;
bool hasCycle(struct ListNode *head) 
{
    //快慢指针来解决
    ListNode* slow = head;ListNode* fast = head; 
    while(fast && fast->next)
    {
        slow = slow->next;
        fast = fast->next->next;
        if(fast == slow)
        {
            return true;
        }
    }
    return false;
}

1,为什么一定会相遇,有没有可能错过,永远追不上?请证明(面试题)

一定会相遇

证明:已知这里是一次走两步

所以我们按照快指针一次两步进行推算

已知是快慢指针,所以我们已经从判断问题,变成了追击问题,

2,slow一次走一步,fast一次走3,4,5,6,n步行不行,为什么,请证明

证明:这里我们需要假设是快指针一次走三步

那此时说明3slow==fast

也就是三倍距离

所以我们进行证明

那么此时有两种可能性

第一种也就是当差距为偶数的时候

第二种也就是当差距为奇数的时候

是否存在追不上的情况(证明)

什么情况下会追不上,也就是当第一次循环没有追上,第二次-1依旧是奇数没有追上,那么此时存在追不上的情况,但是这种情况是否存在?接下来我们进行证明。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值