給定乙個鍊錶,兩兩交換其中相鄰的節點,並返回交換後的鍊錶。
你不能只是單純的改變節點內部的值,而是需要實際的進行節點交換。
根據題意,我以為
對鍊錶1;返回1
對鍊錶1,2;返回2,1
對鍊錶1,2,3;返回2,1,3
對鍊錶1,2,3,4;返回2,1,4,3
對鍊錶1,2,3,4,5;返回2,1,4,3,5
對鍊錶1,2,3,4,5,6;返回2,1,4,3,6,5
以此類推。
class
solution
:def
(self, head: listnode)
-> listnode:
ifnot head:
return head
ls =
cp = head
while
true:if
not head.
next
:break
head = head.
next
n =len(ls)
if n ==1:
return cp
for i in
range(1
, n,4)
: ls[i]
.next
= ls[i -1]
if i==n-
1:ls[i-1]
.next
=none
;break
if i+
1==n-
1:ls[i-1]
.next
=ls[i+1]
;break
ls[i -1]
.next
= ls[i +2]
ls[i +2]
.next
= ls[i +1]
if i +
2==n-
1:ls[i+1]
.next
=none
;break
if i+
3==n-
1:ls[i+1]
.next
=ls[i+3]
;ls[i+3]
;break
ls[i +1]
.next
= ls[i +4]
return ls[
1]
執行用時 :40 ms, 在所有 python3 提交中擊敗了85.6%的使用者思路就是先通過迴圈把煉表裡的節點那順序存入列表。記憶體消耗 :13.7 mb, 在所有 python3 提交中擊敗了5.93%的使用者
然後通過觀察交換的規則以及規律(最好是自行動筆嘗試):
易知道鍊錶的交換是以四個節點為一組,如下圖:
先處理特例,只有乙個節點時返回節點。
只有兩個節點時令2->1->none
只有三個節點時2->1->3
只有四個節點時2->1->4->3->none
只有五個節點時2->1->4->3->5。
除特例以外,按上圖進行節點的指定。
遞迴三件套:
1、終止條件:當節點head為空或節點的next為空時終止,返回head
2、縮減規模:每一層都如圖操作,傳遞下去的引數應該是next.next
3、遞迴的返回:如上圖,正常情況下返回next
如上。
class
solution
:def
(self, head: listnode)
-> listnode:
ifnot head :
return head
ifnot head.
next
:return head
next
=head.
next
head.
next
next
.next
)next
.next
=head
return
next
執行用時 :28 ms, 在所有 python3 提交中擊敗了92.86%的使用者遞迴的套路記憶體消耗 :13.5 mb, 在所有 python3 提交中擊敗了41.44%的使用者
力扣(LeetCode) 兩兩交換鍊錶中的結點
解題思路 先讚後看,時薪百萬!首先我們用考慮把大象裝進冰箱分幾步法考慮這個題。我們要做的就是找到4個點 頭 可以是空 點1點2 尾 可以是空 當前 頭 可以是空 點1 點2 尾 可以是空 目標 頭 可以是空 點2 點1 尾 可以是空 我們需要幹的活兒 步1.讓頭指向點2 步2.讓點2指向點1 步3....
力扣 24 兩兩交換鍊錶中的節點 鍊錶 遞迴
思路一 順著做,這樣也有兩種做法。第一種就是直接兩個兩個交換,那麼需要記錄前驅和後繼。第二種就是先把鍊錶分成兩個小的鍊錶,乙個儲存奇數字置的樹,乙個儲存偶數字置的數,然後再把他們合起來。definition for singly linked list.struct listnode class s...
兩兩交換鍊錶中的節點
給乙個鍊錶,兩兩交換其中的節點,然後返回交換後的鍊錶。樣例 給出 1 2 3 4,你應該返回的鍊錶是 2 1 4 3。遞迴方式 交換p 和 p.next 結點 swaphead p.next swaphead.next p definition for singly linked list.publ...