leetcode每日一題143 重排鍊錶

2021-10-25 00:01:28 字數 1163 閱讀 6952

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

class

solution

:def

reorderlist

(self, head: listnode)

->

none

:"""

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

"""# 利用雙指標

ifnot head:

return

none

#找到鍊錶的中間節點

#快慢指標

slow,fast = head,head

while fast and fast.

next

: slow = slow.

next

fast = fast.

next

.next

# 完成迴圈後slow 指向中間結點,fast 指向最後乙個結點或者倒數第二個結點(奇數指向最後乙個,偶數指向倒數第二個)

# print(slow.val)

per,cur =

none

,slow.

next

slow.

next

=none

# 後半部分進行翻轉

while cur:

nxt = cur.

next

cur.

next

= per

per,cur = cur,nxt

# 交替合併

p,q = head,per

while q:

nxt = p.

next

p.next

= q p,q = q,nxt

return head

翻轉函式解析:

每日一題 LeetCode

在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數。示例 1 輸入 7,5,6,4 輸出 5 限制 0 陣列長度 50000 思想是 分治演算法 所有的 逆序對 於 3 個部分 左邊區間的逆序對 右邊區間的逆序對 橫跨兩個區間的...

Leetcode 每日一題 143 重排鍊錶

給定乙個單鏈表 l l0 l1 ln 1 ln 將其重新排列後變為 l0 ln l1 ln 1 l2 ln 2 你不能只是單純的改變節點內部的值,而是需要實際的進行節點交換。這個問題的物件如果是支援下標索引的陣列那就簡單很多了,根據陣列下標進行重組就可以,但是鍊錶本身是不支援下標索引的,所以很自然地...

LeetCode每日一題(題1028)

最近在刷leetcode每日一題,每次做完之後總能有些收穫,所以想著不如每天寫個部落格記錄一下做的題目的解法以及自己寫的時候問題出在 從先序遍歷還原二叉樹 題目大意 給出乙個字串 1 2 3 4 5 6 7 1代表節點的值,前面的 個數代表節點的深度。如果只有乙個子節點,保證這個節點為左子節點。返回...