鍊錶 143 重排鍊錶

2021-10-17 16:30:05 字數 1128 閱讀 8087

給定乙個單鏈表 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,因此直接合併即可。

class

solution

/** 得到中間節點 */

listnode middle =

middlenode

(head)

; listnode l1 = head;

listnode l2 = middle.next;

/** 把前半段和後半段斷掉 */

middle.next = null;

/** 反轉後半部分 */

l2 =

reverselist

(l2)

;/** 前半部分和後半部分合併 */

mergelist

(l1, l2);}

public listnode reverselist

(listnode head)

return pre;

}public listnode middlenode

(listnode head)

return slow;

}/** 合併函式比較重要 */

public

void

mergelist

(listnode l1, listnode l2)

}}

143 重排鍊錶

143.重排鍊錶 給定乙個單鏈表 l l0 l1 l n 1 ln 將其重新排列後變為 l0 l n l1 l n 1 l2 l n 2 你不能只是單純的改變節點內部的值,而是需要實際的進行節點交換。示例 1 給定鍊錶 1 2 3 4,重新排列為 1 4 2 3.示例 2 給定鍊錶 1 2 3 4 ...

143 重排鍊錶

題解 時間複雜度 o n 空間複雜度 o n definition for singly linked list.struct listnode listnode int x val x next nullptr listnode int x,listnode next val x next nex...

143 重排鍊錶

題目 給定乙個單鏈表 l l0 l1 l n 1 ln 將其重新排列後變為 l0 l n l1 l n 1 l2 l n 2 你不能只是單純的改變節點內部的值,而是需要實際的進行節點交換。示例 1 給定鍊錶 1 2 3 4,重新排列為 1 4 2 3.示例 2 給定鍊錶 1 2 3 4 5,重新排列...