LeetCode 143 重排鍊錶

2021-10-24 05:41:26 字數 2027 閱讀 3488

【2023年計算機統考408真題】

給定乙個單鏈表 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.
發現是由l摘取第乙個元素,再摘取倒數第乙個元素…依次合併成的。

為了方便鍊錶後半段取元素,需要先將l後半段原地逆置,否則每取最後乙個節點都需要遍歷一次鍊錶。

【408真題題目要求空間複雜度為o(1),不能借助棧】

步驟

先找處鍊錶l的中間結點,為此設定兩個指標p和q,指標p每次走一步,指標q每次走兩步,當指標q到達鏈尾時,指標p正好在鍊錶的中間結點;

然後將l的後半段結點原地逆置;

從單鏈表前後兩段中 依次各取乙個結點,按要求重排;

後半段逆置那裡搞不懂的可以去看看力扣有一道題 反轉鍊錶

另外這個題與判斷 回文鍊錶 那一題所用的方法一樣,一塊整理著學習效果不錯

# definition for singly-linked list.

# class listnode:

# def __init__(self, val=0, next=none):

# self.val = val

# self.next = next

class

solution

:def

reorderlist

(self, head: listnode)

->

none

:"""

do not return anything, modify head in-place instead.

"""ifnot head or

not head.

next

ornot head.

next

.next

:return

slow, fast = head, head.

next

while fast and fast.

next

: slow, fast = slow.

next

, fast.

next

.next

new_head = slow.

next

slow.

next

=none

new_head = self.revserve_list(new_head)

while new_head:

post = new_head.

next

new_head.

next

= head.

next

head.

next

= new_head

head = new_head.

next

new_head = post

defrevserve_list

(self, head):if

not head or

not head.

next

:return head

prev =

none

while head:

post = head.

next

head.

next

= prev

prev = head

head = post

return prev

時間複雜度: o(n)

leetcode 題解討論區

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...