LC143 重排鍊錶

2021-10-10 16:48:06 字數 2995 閱讀 4660

難度中等459收藏分享切換為英文接收動態反饋

給定乙個單鏈表 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, 重新排列為 1->5->2->4->3.
單鏈表不能由尾部開始遍歷取數,只能有頭開始遍歷,

因此將所有遍歷出來,儲存到線性表中,

通過前後雙指標進行連線,得到結果

//存到 list 中去

list

list =

newarraylist

<

>()

;while

(head != null)

//頭尾指標依次取元素

int i =

0, j = list.

size()

-1;while

(i < j)

list.

get(j)

.next = list.

get(i)

; j--;}

list.

get(i)

.next = null;

}具體思路如圖所示

思路

利用快慢指標法,求出鍊錶的中間節點

得到兩個子鏈標後,將最後乙個反轉

然後將子鍊錶中的節點依次進行連線,得出的結果

有關合併的解圖

// 1. 找中點,讓slow指向中點,或左中點位置

listnode slow = head, fast = head.next;

while

(fast != null && fast.next != null)

// 2. 斷開中點,反轉後半部分

listnode head2 = null, next = slow.next;

slow.next = null;

slow = next;

while

(slow != null)

// 3. 合併鍊錶head和head2

listnode curr = head;

listnode curr2 = head2;

while

(curr != null && curr2 != null)

}相對於其他遞迴的解法

class

solution

//1. 使用快慢指標,找出鍊錶的中心節點。

// 1->2->3->4->5,中心節點為3

listnode middle =

middlenode

(head)

;//2. 將原始鍊錶按照中心鍊錶分割為兩個鍊錶,並將右鍊錶反轉

原始鍊錶:1->2->3->4->5 左鍊錶:1->2->3 右鍊錶:4->5

listnode left = head;

listnode right = middle.next;

middle.next = null;

反轉右鍊錶

//原始右鍊錶:4->5 反轉後:5->4

right =

reverse

(right)

;//3. 合併兩個鍊錶,將右鍊錶插入到左鍊錶

//左鍊錶:1->2->3 右鍊錶:4->5 合併後:1->5->2->4->3

merge

(left,right);}

//1. 使用快慢指標,找出鍊錶的中心節點

public listnode middlenode

(listnode head)

return slow;

}//2. 通過遞迴反轉鍊錶

public listnode reverse

(listnode head)

listnode last =

reverse

(head.next)

; head.next.next = head;

head.next = null;

return last;

}//3. 合併兩個鍊錶,將右鍊錶插入到左鍊錶

public

void

merge

(listnode left, listnode right)

}}

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,重新排列...