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; } } }