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

浙公网安备 33010602011771号