思路:
1.先判断是否为环形链表,否的话 返回null
2.如果是环形链表:
定义两个引用,h1指向头结点,h2指向第一次相遇时的节点位置(第一次相交位置),然后h1,h2同时走,相遇时就是环的入口处
public class Solution {
public ListNode detectCycle(ListNode head) {
if(head == null || head.next == null){
return null;
}
//先判断是否有环
ListNode fast = head;
ListNode slow = head;
boolean tmp = false;
while(fast != null && fast.next != null){
fast = fast.next.next;
slow = slow.next;
if(fast == slow){
tmp = true;
break;
}
}
if(tmp != true){
return null;
}
//创建两个引用 一个从头结点开始 一个从相遇位置开始,每次一起走一步
//相等时,就是环的入口点, 不管第一次判断环时是在环头环尾相遇 每次两个引用一次走一步,相遇时都是环入口位置
//环节点数为奇数时 第一次判断是否有环时,会在环末尾相遇
//环节点数为偶数时 第一次判断是否有环时,会在环头相遇,
ListNode h1 = head;
ListNode h2 = fast;
//一定会找到入口点
while(h1 != h2){
h1 = h1.next;
h2 = h2.next;
}
return h1;
}
}
运行结果