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

142. 环形链表 II_快慢指针_02

142. 环形链表 II_单链表_03


public class Solution {
    public ListNode detectCycle(ListNode head) {
        if(head==null){
            return head;
        }
        /**
        还是快慢指针解法
            快的每次走2  慢的每次走1
                最终相遇
            再让两个节点从相遇点和头开始走,相遇的地方就是入口, 见图
         */
         ListNode fast=head;
         ListNode low=head;
         while(true){
             if(fast==null||fast.next==null) return null;//说明没有环
             fast=fast.next.next;
             low=low.next;
             if(fast==low) break;
         }
      
         fast=head;
         while(fast!=low){
             fast=fast.next;
             low=low.next;
         }
         //相遇点就是入口
         return low;
        
    }
}