环形链表(是否成环)(简单)(证明题)
题目
解题思路
1,我们把判断问题,用快慢指针搞成追击问题
2,找到环形链表里面的相交节点,所以我们设立快慢指针
- slow,fast
- 所以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依旧是奇数没有追上,那么此时存在追不上的情况,但是这种情况是否存在?接下来我们进行证明。
环形链表(是否成环)(简单)(证明题)
于 2024-05-08 23:23:40 首次发布