難度中等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,重新排列...