前往
大廳
主題

LeetCode - 143. Reorder List 解題心得

Not In My Back Yard | 2022-06-14 12:00:01 | 巴幣 0 | 人氣 399

題目連結:


題目意譯:
你被給定一個單向連結串列(Singly Linked List)的開頭 head。該串列可以被表示為以下形式:
L0 → L1 → … → Ln - 1 → Ln

請將該串列重新排列成以下形式:
L0 → Ln → L1 → Ln - 1 → L2 → Ln - 2 → …

你不得改變這個串列中的節點值。只有節點本身可以挪動。

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



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

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


解題思維:
本題可以把題目敘述中的新順序視為以下操作之結合:
一:把原串列切一半,分成左右。其中原串列有奇數的節點的時候,最中間的節點往右(含)將屬於右側;而數量為偶數時,最中間兩個節點中的右邊者往右(含)將屬於右側。

二:把右側的串列反轉。

三:把兩個串列交錯在一起。

其中操作一要定位「中間」即是這題的要求,操作二可以套用這題的方式。

因此最後需要額外講解的是操作三。作法很簡潔,利用兩個指標 first 和 second 分別指向左側和反轉的右側之頭,然後再定義一個暫存用的指標 buffer,接著做以下步驟直到兩者都掃完為止:
因為等等會動到 first->next,所以先用 buffer 來保留 first->next 之內容。因此接著把 first->next 指向 second。最後把 first 指向 buffer(即原 first->next);

而 second 也是類似。用 buffer 保留 second->next、將 second->next 指向 first,最後再把 second 指回 buffer 即可。




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

創作回應

相關創作

更多創作