这两道题很简单,思路都是两个节点从head开始,一个一次走一步,另一个走两步,如果遇到了就说明有循环。
第二题是要寻找循环的开始,由于在一个环中,如果两个节点一个一次1步,另一个一次2步,则他们永远在环的某个固定节点相遇。所以我们把换前面的链扳弯贴合在环上,则链表头的位置即为环中两点相遇的地方。所以此点到环开始的地方和链表头到环开始的地方的距离是相同的,所以先找到相遇点,再将其中一个移到链表头,同时以1次1步前进,则会在环的开端相遇。
public ListNode detectCycle(ListNode head) {
if (head==null)return null;
ListNode m = head;
ListNode n = head;
while (true){
if (m.next==null) return null;
if (n.next==null) return null;
if (n.next.next==null) return null;
m=m.next;
n=n.next.next;
if(m.equals(n))break;
}
m=head;
while (!m.equals(n)){
m=m.next;
n=n.next;
}
return m;
}