leetcode 143 重排鍊錶

2021-10-23 10:12:12 字數 2575 閱讀 4960

143. 重排鍊錶

給定乙個單鏈表 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.

開始我想到另乙個辦法,就是效率太低了。

[1,2,3,4,5] ->[1,5,4,3,2]->[1,5,2,3,4]->[1,5,2,4,3]
每次反轉後面的鍊錶,反轉之後,往後移動一位。

但是會超時=-=

# 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

:return head

defsolve

(cur)

:#反轉該節點以及之後的鍊錶

pre =

none

while cur:

next

= cur.

next

cur.

next

= pre

pre = cur

cur =

next

return pre

while head.

next

:#對於每乙個節點,依次翻轉相連

head.

next

= solve(head.

next

) head = head.

next

這裡使用的是使用快慢指標找到中點,反轉後面的鍊錶,然後再對前後兩部分鍊錶進行合併。這樣做的效率就好很多。

# 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

:return head

slow = head

fast = head

while fast.

next

and fast.

next

.next

:#快慢指標找中點[1,2,3,4,5]

slow = slow.

next

fast = fast.

next

.next

#反轉後面部分的鍊錶

pre =

none

cur = slow.

next

while cur:

next

= cur.

next

cur.

next

= pre

pre = cur

cur =

next

slow.

next

= pre#前半部分和後面反轉後的一般連線起來 [1,2,3,5,4]

#開始拼接

p1 = head #煉表頭

p2 = slow.

next

#反轉頭

while p1 != slow:

#交叉連線的順序很重要,先連線尾部

slow.

next

= p2.

next

p2.next

= p1.

next

p1.next

= p2

p1 = p2.

next

p2 = slow.

next

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