142 环形链表II

在这里插入图片描述
解题思路:
\qquad 之前在 环形链表I 中讲过利用快慢指针判断链表是否有环,当快慢指针相等时,链表中存在环。但环形链表II在其基础上,额外需要找到环的第一个节点,可以在快慢指针相遇的基础上,进一步分析。

\qquad 如果链表存在环,则快慢指针相遇于环上一点(如下图),将链表拆分成a, b, c三段,题目需要返回a、b段交界点的指针,由快慢指针相遇可得:

2 ( a + b ) = a + b + n ( b + c ) 2(a+b) = a + b + n(b+c) 2(a+b)=a+b+n(b+c)
a = n ( b + c ) − b a = n(b+c) - b a=n(b+c)b
a = c + ( n − 1 ) ( b + c ) a = c + (n-1)(b+c) a=c+(n1)(b+c)

\qquad 此时,如果使用两个指针分别从表头和相遇点开始移动,则这两个指针会相遇于环开始的节点,此时返回结果即可。 在这里插入图片描述

ListNode *detectCycle(ListNode *head) {
        ListNode* slow = head;
        ListNode* fast = head;
        ListNode* pos = head;
        while(fast != nullptr)
        {
            slow = slow->next;
            if(fast->next != nullptr)
            {
                fast = fast->next->next;
            }
            else return nullptr;
            
            if(slow == fast)
            {
                while(pos != slow)
                {
                    slow = slow->next;
                    pos = pos->next;
                }
                return pos;
            }
        }
        return nullptr;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值