142. Linked List Cycle II

题目大意:给定一个单链表,找出其环路的起始点。若不存在环路,则返回NULL。

大概思路:数学题

头结点是A,题目要求的环路起点为B,在141题快慢指针算法中求出的相遇点为C。

设A到B的距离为a,B到C的距离为b,环路一圈的距离为c。

则(a+b)*2=a+b+k*c;(其中k为常数)

则a+b=k*c;

两个指针分别以相同速度从A、B出发,第一个指针到达B点,路程为a,第二个指针此时走的路程也为a=k*c-b,即也到达了B点,可知两个指针在B点相遇。

code:

struct ListNode *detectCycle(struct ListNode *head) {
    struct ListNode *fast=head;
    struct ListNode *slow=head;
    if(!head||!(head->next)) return NULL;
    while((fast->next)&&(fast->next->next)){
        fast=fast->next->next;
        slow=slow->next;
        if(fast==slow){
            break;
        }
    }
    if(!(fast->next)||!(fast->next->next)) return NULL;
    else{
        slow=head;
        while(slow!=fast){
            slow=slow->next;
            fast=fast->next;
        }
        return slow;
    }
    
}



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值