reorder list
given a singly linked list l: l0→l1→…→ln-
1→ln,
reorder it to: l0→ln→l1→ln-
1→l2→ln-
2→…you may not modify the values in the list's nodes, only nodes itself
may be changed.
example 1
:given 1
->2-
>3-
>
4, reorder it to 1
->4-
>2-
>
3.example 2
:given 1
->2-
>3-
>4-
>
5, reorder it to 1
->5-
>2-
>4-
>
3.
快慢指標確認中點 + 翻轉插入鍊錶
這道題可作如下轉化:
步驟一: 找到鍊錶中點後分割其為 left 鍊錶、right 鍊錶兩部分;
步驟二: 翻轉 right 鍊錶, 翻轉鍊錶思路同 206.reverse_linked_list;
步驟三: 接著從 left 鍊錶的左側, 翻轉後的 right 鍊錶的左側各取乙個值進行交替拼接
快慢指標即 quick 指標每次走兩步, slow 指標每次走一步, 同 148.sort_list
void
reorderlist
(listnode* head)
//後端反轉
listnode *needreverser = slow-
>next;
slow-
>next =
null
; needreverser =
reverse
(needreverser)
;//插入前端縫隙
listnode *cur = head;
while
(cur && needreverser)
}
listnode *
reverse
(listnode *head)
return p1;
}
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...