Leetcode142,寻找环状链表入环点

Leetcode142

1、需求

给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null

2、解题思路

判断是否有环,可以使用Set集合,但是它是无序的,所以不能确定入环位置的下标,所以要使用快慢指针法。

如图示1所示,假设从起始点到入环点距离为a,当慢指针走到入环点的时候,快指针走了2a,(因为快指针走两步,慢指针走一步),假设从2a位置到入环点距离为x。

图示二所示,当x步后,快慢指针相遇,此时,相遇点与入环点距离为a。此时,声明第三个节点,位置在起始点,第三节点和慢指针每次走一步,a次之后,则在入环点相遇。

3、java代码

public ListNode detectCycle2(ListNode head) {

        if(head == null){
            return null;
        }
        ListNode fast = head.next.next;
        ListNode slow = head;

        while(slow != fast){
            //如果fast = null代表fast和slow在一个节点,代表fast追上slow,则有环
            //如果fast = null代表此链表没有环

            if( fast == null || fast.next == null){
                return null;
            }
            fast = fast.next.next;
            slow = slow.next;
        }
        //程序运行到此,代表fast = slow

        ListNode newNode = head;

        while(slow != newNode){
            newNode = newNode.next;
            slow = slow.next;
        }
        return newNode;
    }
posted @ 2021-03-14 16:17  千叶翔龙  阅读(52)  评论(0)    收藏  举报