本题用快慢指针来做。需要判断俩个位置,一个是快慢指针何时相遇判断有环形链表,一个是环形链表的起点如何判断。
用一个快指针和一个慢指针,快指针一次移动两个节点,慢指针移动一个节点,如果二者相等,说明链表中有环形链表。
第二个问题比较复杂,最终结论是重新定义一个指针从头结点开始与相交的指针一起向后移动,直到二者相等时,这个位置就是环形链表的入口节点。
/**
* 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 fast = head;
ListNode slow = head;
while (true) {
if (fast == null || fast.next == null) {return null;}
slow = slow.next;
fast = fast.next.next;
if (fast == slow) break;
}
slow = head;
while (fast != slow) {
slow = slow.next;
fast = fast.next;
}
return fast;
}
}
//下方的注释代码是原代码,我的while循环条件是快指针与慢指针相等,
//答案的条件是死循环,当快慢指针相等的时候跳出循环。我的结果是最终答案标记在正确答案前一个。
/* while (fast != slow) {
if (fast == null || fast.next == null) return null;
fast = fast.next.next;
slow = slow.next;
}
ListNode cur = fast;
slow = head;
while (cur != slow) {
slow = slow.next;
cur = cur.next;
}
return fast;*/