前往
大廳
主題

LeetCode - 86. Partition List 解題心得

Not In My Back Yard | 2021-05-17 00:00:06 | 巴幣 0 | 人氣 433

題目連結:


題目意譯:
給定一個連列串列(Linked List)的頭 head 以及一個值 x,將其切分變為所有節點值小於 x 的排在所有值大於等於 x 之節點的前面。

你應在兩個切割部分中各自保持著原有的節點相對順序。

限制:
串列中的節點數位於範圍 [0, 200] 中。
-100 ≦ Node.val ≦ 100
-200 ≦ x ≦ 200



範例測資:
範例 1:
輸入: head = [1,4,3,2,5,2], x = 3
輸出: [1,2,2,4,3,5]

範例 2:
輸入: head = [2,1], x = 2
輸出: [1,2]


解題思維:
令兩個新的節點 d1 、 d2 分別作為 < x 的節點之串列開頭和 ≧ x 之串列開頭(這兩個開頭是暫存用,不會出現於答案中),以及另外兩個指標 r1 、 r2 用來分別指向 d1 、 d2 這兩個串列的結尾。

接著掃過給定的串列中所有節點。

當目前節點 node,其 node->val < x 時,我們需要將 node 放到 d1 的結尾,因此 r1->next 要設為 node、r1 接著再指到 node;反之,node->val ≧ x,則將 node 放到 d2 結尾,因此 r2->next 要設為 node 、 r2 接著再指到 node。

最後,因為兩個串列要合併,所以 r1->next 設為 d2.next、r2->next 設為空節點(確保結尾沒有指到別的節點)。

此時,d1.next 即是所求的切分後之串列。




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

創作回應

更多創作