剑指Offer:环形链表的入口

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指Offer:环形链表的入口相关的知识,希望对你有一定的参考价值。

解题思路

1.使用快慢指针fast和slow来判断链表是否有环,以及快慢指针相遇的点在哪里。
2.找到相遇的点之后,在定义一个新的p节点指向head头节点,然后让p和慢指针slow每次都走一步,直到相遇,就是链表的入口。也就是说从head到入口的距离和从相遇的点到入口的距离是一样的
为什会这样呢?
技术图片
证明:a=n
1.假设慢指针slow在进入环形圈内第一圈就和快指针fast相遇。
此时fast已经开始第2圈了
2.fast和slow同时出发,所以相遇时两个指针花费的时间一样
3.fast一次走两步,slow一次走一步,所以fast的速度是slow的2倍,即fast的路程是slow的2倍
4.推导:
fast=a+m+n+m
slow=a+m
fast=2*slow
所以:a+m+n+m=2a+2m
化简:a=n.也就是从head到入口的距离与从相遇的点到入口的距离一样

代码

/**
 * Definition for singly-linked list.
 * class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    public ListNode detectCycle(ListNode head) {
        ListNode first=head;
        ListNode slow=head;
        while(first!=null&&first.next!=null){
            first=first.next.next;
            slow=slow.next;
            if(slow==first){//快慢指针相遇
                ListNode p=head;//引入p来卡点慢指针可以停到入口
                while(p!=slow){
                    p=p.next;
                    slow=slow.next;
                }
                return p;
            }
        }
        return null;
    }
}

以上是关于剑指Offer:环形链表的入口的主要内容,如果未能解决你的问题,请参考以下文章

#yyds干货盘点# 解决剑指offer:链表中环的入口结点

剑指offer-链表中环的入口结点

剑指offer系列29-----链表中环的入口节点-

剑指offer:链表中环的入口节点

55剑指offer--链表中环的入口结点

剑指Offer对答如流系列 - 链表中环的入口节点