前往
大廳
主題

LeetCode - 2487. Remove Nodes From Linked List 解題心得

Not In My Back Yard | 2023-10-27 12:00:34 | 巴幣 0 | 人氣 138

題目連結:


題目意譯:
你被給定一個連結串列(Linked List)的開頭 head。

請移除若干個節點,其中每個節點都存在著一個位於其右側之節點且該節點之值大於自身之值。

回傳修改後的連結串列之開頭。

限制:
給定的串列之節點數位於範圍 [1, 10 ^ 5] 之中。
1 ≦ Node.val ≦ 10 ^ 5



範例測資:
範例 1:
輸入: head = [5,2,13,3,8]
輸出: [13,8]
解釋: 應被移除的節點為 5 、 2 和 3。
- 節點 13 位於節點 5 之右側。
- 節點 13 位於節點 2 之右側。
- 節點 8 位於節點 3 之右側。

範例 2:
輸入: head = [1,1,1,1]
輸出: [1,1,1,1]
解釋: 每一個節點值都為 0,因此沒有節點應被移除。


解題思維:
可以看到實際上我們基本上就是在求每個節點的右側所有節點中的最大節點值(不包含自身)。如果該最大值大於自身的值,則要被移除;反之則保留。

因此可以看到最後留下的節點從左至右將會形成一個非遞增的序列(因為不是的話會有節點可以被移除)。



因為題目給定的連結串列是單向的,因此往右到左的方向較不方便。所以我們可以先將給定的串列反轉(參見這題),然後維護上述提及的非遞減性質(記得現在反轉了,因此非遞增變成了非遞減),也就是說只要現在的「結尾」(代表著現在看到的最大值)小於或等於「現在看到」的節點值,則代表現在看到的節點可以取代原先結尾成為新的結尾,而兩者中間的節點則被移除(如果先前有更大的節點值,則將會提早取代原先的結尾。因此剩下被考慮的都是節點值較小者)。

最後掃完之後再將串列反轉回來即是所求。




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

創作回應

更多創作