环形链表(数学方法)

题目链接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; 

    }

};

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值