Bootstrap

每日算法----环形链表II(Java)

本题在上个环形链表的基础上增加了难度,让找其环形链表的第一个节点

还是原先的思路,定义快慢指针

在第一次快慢指针相等时,a是到环形前的节点个数,k是离环形节点有多远

快指针走了a+n圈环形+k

慢指针走了a+m圈环形+k

此时快指针走的路程是慢指针2倍。慢指针= 快指针-慢指针 = n圈环形 ,这里的n的值和上面n不一样,你们懂我意思就可以

从起点开始算a+n圈环形就是环形链表的起始节点所以,此时慢指针在加上a的长度就可以找到起始节点,可以将快指针变成头节点,每次和慢指针一样都只走一步

public class A07detectCycle {
    
    public ListNode detectCycle(ListNode head) {
        ListNode slow  = head;
        ListNode fast  = head;
        while (fast != null && fast.next!= null){
                slow = slow.next;
                fast = fast.next.next;
                if (slow == fast){
                    fast = head;//将快指针从头节点重新遍历
                    while (slow != fast){
                        slow = slow.next;
                        fast = fast.next;
                    }//完成对慢指针加a
                    return slow;
                }
            }
        return null;
    }
 class ListNode {
        int val;
        ListNode next;
        ListNode() {
        }
        ListNode(int val) {this.val = val;}
        ListNode(int val, ListNode next) {this.val = val;this.next = next;}
    }
}

;