給乙個鍊錶,若其中包含環,請找出該鍊錶的環的入口結點,否則,輸出null;
鍊錶中某些結點構成了乙個環,找打環的入口結點
head->a1->a2->a3...
使用雙層迴圈,例如對於結點a1,遍歷整個鍊錶判斷是否有a1 = head->next;(head = head->next);a2,a3,......an;依次
測試報錯,沒通過
/*
struct listnode
};*/
class solution
else
}temp = temp->next;
}if(temp == null)}};
另外,參考:卻顧所來徑
step1、找兩者相遇點
設定兩個指標,快指標fast每次走兩個結點的距離,慢指標slow每次走乙個結點的距離;
鍊錶中沒有環,直到走完整個鍊錶,slow不可能追上fast;
鍊錶中有環,fast先進環,繞環走,slow後進環,相相當於fast在追slow,兩者一定會相遇;
step2:
兩個指標,slow從表頭開始走,fast從相遇點開始走(兩者速度一樣,每次走乙個結點),最後一定相遇與環入口;
表頭到環入口的距離為a;環入口到相遇點的距離為b;相遇點到環入口距離為c;
實現過程:
1、當fast、slow兩者相遇時,快指標的路程是慢指標路程的兩倍:
(因為兩者走是同步的,只不過fast速度是slow的兩倍,不管相不相遇,同一時刻,fast走的路程都是slow的兩倍)
fast走的路程:a+(b+c)*k+b
slow走的路程:a+b
(a+b)*2 = a+(b+c)*k+b --》a = (k-1)*(b+c)+c (1)
即,煉表頭到環入口的距離 = 相遇點到環入口距離 + 環長度*(k-1)
2、記錄相遇結點之後,讓fast從相遇結點開始走,slow從表頭開始走,兩者一定在環入口相遇。
為什麼會在環入口相遇?根據公式(1)計算得到
class solution
while(fast && slow)else
}//fast從相遇點出發,slow從表頭出發
slow = phead;
while(fast != slow)
return fast;}};
測試通過**
class solution
} //此時fast 及fast->next為空,返回null
if(!fast || !fast->next)
return null;
// 難點:slow從表頭出發,fast從相遇點出發,為什麼當fast和slow相遇一定是在環入口
// 本身資料結構不難,難的是,將問題抽象為數學模型
slow = phead;//low從煉表頭出發
while(fast != slow)
return slow;
}};
鍊錶 鍊錶中環的入口結點
給乙個鍊錶,若其中包含環,請找出該鍊錶的環的入口結點,否則,輸出null。知識點回顧 快慢指標 思路 使用快慢指標 假設有p,q兩指標,p每步跨乙個結點,q每步跨兩個結點。那麼經過k步之後q比p多走過的結點數為k。如果鍊錶中沒有環,那麼q永遠在p的前面,兩指標不會相遇。如果鍊錶有環,且環中結點個數為...
鍊錶中環的入口結點
乙個鍊錶中包含環,請找出該鍊錶的環的入口結點。class listnode public class solution return p1 return null 分析 假設鍊錶的起始點到環的入口點節點數為k,環的的節點數為x,讓p2的速度是p1的兩倍,p1和p2相遇在環的第y各節點,可以得到如下等...
鍊錶中環的入口結點
題目要求 乙個鍊錶中包含環,請找出該鍊錶的環的入口結點 分析 1 一種比較偷懶的方法就是遍歷鍊錶,並直接利用hashmap來儲存已經遍歷過的結點。一旦發現已經儲存過的結點,那麼該結點就是環的入口結點。2 參考自 我簡單畫了乙個圖 上傳之後一直是橫過來的。不知道為什麼轉不正 設定兩個指標p1和p2,乙...