題目描述:
一個連結清單中包含環,請找出該連結清單的環的入口結點。
1. 判斷是否為環形連結清單:設定一快一慢連個節點,慢的一次走一個節點,快的一次走2各節點。若為環形,則快節點能追趕上慢節點,記此節點為meetNode。
2. 計算環内節點數:meetNode一定在環形内,以它為起點周遊一圈,得到換内節點數量,記為n。
3. 找的入口節點:設定node1,node2節點同時從頭結點出發,node2先走n步,然後node1、node2同時走,當兩節點相遇時的節點,即為入口節點。
public ListNode EntryNodeOfLoop(ListNode pHead) {
ListNode n1 = pHead;
ListNode n2 = pHead;
//尋找環内一節點
while (n2.next != null && n2 != null) {
n1 = n1.next;
n2 = n2.next.next;
if (n1 == n2)
break;
}
if (n2 == null || n2.next == null) {
return null;
}
//計算換内節點數
int count = 1;
n2 = n2.next;
while (n2 != n1) {
n2 = n2.next;
count++;
}
//尋找入口節點
n1 = pHead;
n2 = pHead;
for (int i = 0; i < count; i++) {
n2 = n2.next;
}
while (n1 != n2) {
n1 = n1.next;
n2 = n2.next;
}
return n1;
}