給定乙個單鏈表 l:l0→l1→…→ln-1→ln ,
將其重新排列後變為: l0→ln→l1→ln-1→l2→ln-2→…
你不能只是單純的改變節點內部的值,而是需要實際的進行節點交換。
示例 1:
給定鍊錶 1->2->3->4, 重新排列為 1->4->2->3.
示例 2:
給定鍊錶 1->2->3->4->5, 重新排列為 1->5->2->4->3.
尋找鍊錶中點 + 鍊錶逆序 + 合併鍊錶
注意到目標鍊錶即為將原鍊錶的左半端和反轉後的右半端合併後的結果。
這樣我們的任務即可劃分為三步:
找到原鍊錶的中點(參考「876. 鍊錶的中間結點」)。
我們可以使用快慢指標來 o(n)o(n) 地找到鍊錶的中間節點。
將原鍊錶的右半端反轉(參考「206. 反轉鍊錶」)。
我們可以使用迭代法實現鍊錶的反轉。
將原鍊錶的兩端合併。
因為兩鍊錶長度相差不超過 11,因此直接合併即可。
複雜度分析
時間複雜度:o(n)o(n),其中 nn 是鍊錶中的節點數。
空間複雜度:o(1)o(1)。
class
solution
listnode mid =
middlenode
(head)
; listnode l1 = head;
listnode l2 = mid.next;
mid.next = null;
l2 =
reverselist
(l2)
;mergelist
(l1, l2);}
public listnode middlenode
(listnode head)
return slow;
}public listnode reverselist
(listnode head)
return prev;
}public
void
mergelist
(listnode l1, listnode l2)
}}
Leetcode 143 重排鍊錶
給定乙個單鏈表 l l0 l1 l n 1 ln 將其重新排列後變為 l0 l n l1 l n 1 l2 l n 2 你不能只是單純的改變節點內部的值,而是需要實際的進行節點交換。解題思路 前一半 0,size 1 2 的結點位址進入佇列,先進先出,後一半 size 1 2,size 的結點入棧,...
LeetCode 143 重排鍊錶
給定乙個單鏈表 l l0 l1 l n 1 ln 將其重新排列後變為 l0 l n l1 l n 1 l2 l n 2 你不能只是單純的改變節點內部的值,而是需要實際的進行節點交換。解題思路 首先想到的是找到要插入的元素,壓入堆疊,彈出時剛好為期望的順序,然後插入對應位置。再換一種思路,找到待插入節...
leetcode143 重排鍊錶
給定乙個單鏈表 l l0 l1 ln 1 ln 將其重新排列後變為 l0 ln l1 ln 1 l2 ln 2 你不能只是單純的改變節點內部的值,而是需要實際的進行節點交換。示例 1 給定鍊錶 1 2 3 4,重新排列為 1 4 2 3.示例 2 給定鍊錶 1 2 3 4 5,重新排列為 1 5 2...