链表问题
思路是快慢指针
引入头结点
遍历两遍链表,之后如果有环,则引入新的头指针指向链表头,新的头指针和 slow
指针同时向前走,相遇的地方既是环的入口
注意判断条件应该包含 fast
当前是否为空:
while (fast != null && fast.next != null
/**
* 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) {
ListNode dummy = new ListNode(-1);
dummy.next = head;
ListNode fast = dummy, slow = dummy;
while (fast != null && fast.next != null) {
fast = fast.next.next;
slow = slow.next;
if (fast == slow) { // <- 有环
break;
}
}
if (fast == null || fast.next == null) return null;
ListNode cur = dummy;
while (cur != slow) {
cur = cur.next;
slow = slow.next;
}
return cur;
}
}