题目链接142. 环形链表 II - 力扣(LeetCode)
这道题运用的是数学以及物理里面设计到的追击相遇问题
也很好理解,就算出现了到了fast与slow重合的情况而言,因为是fast追上来的(这是肯定的) ,如果是slow的话,就跳出去了,然后slow在动,fast在动,slow在动 ,就追上fast了,而且是一定会追击上的,这样可以很简单的抽象出公式a=2b这个公式是一定成立的
然后就是接下来的比较重要的一步。
就是这个公式当n=1的时候,这个特殊情况,x=z,这个时候,我们只需要定义两个指针Index1和index2这个时候同时移动就会相交
但要是n不是1的时候也没有问题,他因为当两个相交的时候上面那个公式就已经满足了
所以只需要移动两个指针就可以了
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *detectCycle(ListNode *head) {
//这道题主要使用的就是数学方法,非常的有技巧性,当做开阔眼界的题目了
//首先就要想到空指针异常的问题,因为快指针是运动两次的会出现空指针异常的情况
if(head==NULL||head->next==NULL)return NULL;
//首先就是定义初始量以及结束量
ListNode *fast=head->next->next;
if(fast==NULL){
return NULL;
}
//一开始就这样变的话,slow也要跟着一起变,因为很显然,a=2b如果slow不跟着变的话,
//就变成了a=2b+2了就不对了,所以说是带有数学技巧的一些题目
ListNode *slow=head->next;
while(fast!=slow){
fast=fast->next;
if(fast==NULL||fast->next==NULL){
return NULL;
}
fast=fast->next;
slow=slow->next;
}
//定义找到的规律变量
ListNode *Index1=head;
ListNode *Index2=fast;
while(Index1!=Index2){
Index1=Index1->next;
Index2=Index2->next;
}
return Index1;
}
};