142. 环形链表 II

 

 

 https://leetcode-cn.com/problems/linked-list-cycle-ii/solution/huan-xing-lian-biao-ii-by-leetcode/

思路:

(1)首先判断有没有环,把quick与slow设置为head,当满足2的条件时,slow每次移动一个单位,quick每次移动二个单位

(2)当quick!=null&&quick.next!=null时,进行循环(null的next会报错,所以只能用判断快指针的方式,判断循环应不应该继续,有没有环)

(3)假设没环,返回null,有环,

阶段 2

给定阶段 1 找到的相遇点,阶段 2 将找到环的入口。首先我们初始化额外的两个指针: ptr1 ,指向链表的头, ptr2 指向相遇点。然后,我们每次将它们往前移动一步,直到它们相遇,它们相遇的点就是环的入口,返回这个节点。

 用这个图自己试一下就行,亲测可以

/**
 * 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) {
        if(head==null) return null;
        ListNode slow=head;
        ListNode quick=head;
        boolean a=false;//是否有环
        while(quick!=null&&quick.next!=null)//判断条件注意,null的next会报错
        {
            slow=slow.next;
            quick=quick.next.next;
            if(slow==quick)
            {
                a=true;//有环
                break;
            }
        }
        if(a)
        {
             ListNode h=head;
            while(h!=quick)
            {
                h=h.next;
                quick=quick.next;
            }
            return quick;
        }
        else
        {
            return null;
        }
    }
}

  

原文地址:https://www.cnblogs.com/lzh1043060917/p/12843561.html