前往
大廳
主題

LeetCode - 876. Middle of the Linked List 解題心得

Not In My Back Yard | 2021-02-02 00:00:03 | 巴幣 0 | 人氣 373

題目連結:


題目意譯:
給定一個非空,單向連結串列(Linked List)之頭節點 head,回傳其正中間的節點。

如果有兩個節點位於正中間(偶數個節點),回傳第二個中間節點。

注:
給定的列表之節點數介於 1 ~ 100 之間。



範例測資:
範例 1:
輸入: [1,2,3,4,5]
輸出: 列表中的節點 3(序列化: [3,4,5])
回傳的節點之值為 3 。(評測系統序列化此節點之結果為 [3,4,5])。
注意我們回傳的是一個 ListNode 物件 ans,其滿足
ans.val = 3 、 ans.next.val = 4 、 ans.next.next.val = 5 且 ans.next.next.next = NULL。

範例 2:
輸入: [1,2,3,4,5,6]
輸出: 列表中的節點 4(序列化: [4,5,6])
因為列表中有兩個中間節點,其值為 3 和 4 ,而我們回傳第二個。


解題思維:
雖然先掃過一次統計節點數,然後計算應為第幾個節點,之後再掃一次得到目標節點的這個方法可行,但是本題有更巧妙的解法。

這題有提及過龜兔賽跑演算法(The Tortoise and the Hare Algorithm),雖然原始用意是用來找出連結串列的迴圈,但是這題剛好可以使用:
一樣讓烏龜 T 、兔子 H 都從 head 開始, T 一次走一個節點 、 H 一次走兩個節點,走到 H 是 NULL 或是 H.next 是 NULL 為止。

可以看到節點數 C 為奇數時,目標節點應為第 floor(C ÷ 2) 個節點(索引值從 0 開始,其中 floor() 代表下高斯,對於正數來說即無條件捨去小數點)。而上述的兔子 H 會停在最後一個節點並結束執行,此時已經恰好執行了 floor(C ÷ 2) 次,所以 T 正好在第 floor(C ÷ 2) 個節點;

當 C 為偶數時,目標節點應為 C ÷ 2。而兔子 H 會剛好落於 NULL 並結束執行,且此時恰好執行 C ÷ 2 次,所以 T 正好在第 C ÷ 2 個節點。

因此停止時的 T 保證指到目標節點,所以回傳 T 即可。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

更多創作