[LeetCode] 142. Linked List Cycle II

思路:
设几个变量:
a: 链表头到循环头的距离
b: 循环头到相遇点的距离
c: 相遇点到循环头的距离
n: 循环次数
第一次快慢两个节点相遇时, 快节点走的距离是 a + (b + c) * n1 + b, 慢节点走的距离是 a + (b + c) * n2, 然后 a + (b + c) * n1 = 2 * (a + (b + c) * n2), 但我们不用关注那些走过的整圈, (b + c)的倍数都直接消掉即可. 所以我们就有a == c. 所以两个节点相遇以后, 我们再用start指针和walker指针一起向前移动, 直到他们相遇, 相遇点就是循环起始点.

可以参考一下这个博客, 写的很好http://www.jianshu.com/p/ce7f035daf74

ListNode *detectCycle(ListNode *head) {
    if (! head || ! head->next) return NULL;
    ListNode* walker = head;
    ListNode* runner = head;
    ListNode* start = head;

    while (runner->next && runner->next->next) {
        walker = walker->next;
        runner = runner->next->next;
        if (walker == runner) {
            while (walker != start) {
                walker = walker->next;
                start = start->next;
            }
            return start;
        }
    }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值