前往
大廳
主題

LeetCode - 328. Odd Even Linked List 解題心得

Not In My Back Yard | 2022-05-30 12:00:16 | 巴幣 0 | 人氣 282

題目連結:


題目意譯:
給定一個單向鏈結串列(Singly Linked List)的開頭 head,將其分組使得所有奇數索引值的節點接在偶數索引值的節點之前,最後並回傳其新順序的列表。

第一個節點視為奇數,且第二個節點為偶數,以此類推。

注意到偶數與奇數的群組之中,應保有原本的輸入中有的相對順序。

你必須在 O(1) 額外空間複雜度以及 O(n) 時間複雜度下解出此題。

限制:
鏈結串列中的節點數位於範圍 [0, 10 ^ 4] 中。
-10 ^ 6 ≦ Node.val ≦ 10 ^ 6



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

範例 2:
輸入: head = [2,1,3,5,6,4,7]
輸出: [2,3,6,7,1,5,4]


解題思維:
首先,如果 head 為空指標,則直接回傳空指標;如果串列的長度為 1,即 head->next 為空指標,則直接回傳 head 即可。

因此,接下來我們可以假設串列的長度至少為 2。



根據題意,我們可以知道奇數群的開頭就是 head、偶數群的開頭則是 head->next。因此,我們可以額外維護兩個資訊,一個是當前奇數群的結尾 oddTail 以及當前偶數群的結尾 evenTail。兩者一開始分別為 head 和 head->next。

接著我們跳過前兩個節點後掃過剩下整個串列,並在過程中計數(用來計算現在是第幾個節點)。

假設目前我們遇到的節點是 X、編號為 K:
當 K 為奇數時,代表 X 在奇數群裡。因此我們將 X 接在先前遇過的奇數群之尾端,即 oddTail 之後。也就是說,將 oddTail->next 設為 X,並將 oddTail 更新為 X;

同理當 K 為偶數時,我們會將 evenTail->next 設為 X 並將 evenTail 更新為 X。

整個串列掃完之後,我們便可以將奇數和偶數的群組分開(可以看到過程中只更動串列本身,並沒有複製一份串列)。因此最後我們將奇數的結尾與偶數的頭相接即完成題目的要求,此時回傳 head 即可。




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

創作回應

更多創作