前往
大廳
主題

LeetCode - 25. Reverse Nodes in k-Group 解題心得

Not In My Back Yard | 2021-11-20 00:00:05 | 巴幣 100 | 人氣 244

題目連結:


題目意譯:
給定一個連結串列(Linked List),一次反轉 k 個連結串列之節點並回傳修改後的列表。

k 為一正整數且小於等於連結串列之長度。如果節點數不是 k 的倍數,則結尾的剩餘節點們應保持原樣。

你不得修改列表中的節點值,只有節點本身可以更動位置。

限制:
列表中的節點數為 sz。
1 ≦ sz ≦ 5000
0 ≦ Node.val ≦ 1000
1 ≦ k ≦ sz

進階: 你可以利用 O(1) 額外空間解出這道問題嗎?



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

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

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

範例 4:
輸入: head = [1], k = 1
輸出: [1]


解題思維:
在最前面加一個 dummy 指向 head(方便用)。然後從 head 往尾端跑,並將「每個」節點指向其前一個節點。

每 k 個節點為一個群組。每當我們遇到一個群組的結尾節點(因為我們是邊往尾端跑邊反轉,所以實際上現在是一個群組的「開頭」)時,便前一個群組之結尾(dummy 視為「第零個群組之結尾」)指向該節點。

最後判斷最後一個群組是否不足 k 個。如果不夠則代表剛剛的反轉操作是白做的,因此需要將其反轉回去。

最後 dummy->next 即為所求修改後的列表之開頭節點。這樣便只需 O(1) 額外空間以及 O(n) 的時間即可完成本題。




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

創作回應

更多創作