题目链接:https://leetcode-cn.com/problems/linked-list-cycle-ii/description/
给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null
。
说明:不允许修改给定的链表。
进阶:
你是否可以不用额外空间解决此题?
思路:先快慢指针检查有无环 当相遇是有环,然后在让一个指针向下一步移动 当两指针再相遇的时候 得出环的长度,重新将两个指针指向链表头,然后让一个指针先走环的长度,然后两个指针一起走 当他们相遇的时候指针就指向了环的入口(因为前一个指针 比后面一个指针先走了一个环的长度);
/**
* Definition for singly-linked list.
* class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public int isHasCycle(ListNode p1,ListNode p2){
boolean hasCycle=false;
int num=0;
while(p1!=null&&p2!=null){
p1=p1.next;
if(p2.next!=null){
p2=p2.next.next;
}else{
break;
}
if(p1==p2){
hasCycle=true;
p1=p1.next;
num++;
while(p1!=p2){
p1=p1.next;
num++;
}
break;
}
}
return hasCycle==true?num:0;
}
public ListNode detectCycle(ListNode head) {
if(head==null){
return null;
}
ListNode slow=head;
ListNode fast=head;
int num=isHasCycle(slow,fast);
if(num==0){
return null;
}
ListNode p1=head;
ListNode p2=head;
while(num>0){
p1=p1.next;
num--;
}
while(p1!=p2){
p1=p1.next;
p2=p2.next;
}
return p1;
}
}