力扣日記 024 兩兩交換鍊錶中的節點 遞迴

2021-09-29 23:16:52 字數 2960 閱讀 2692

給定乙個鍊錶,兩兩交換其中相鄰的節點,並返回交換後的鍊錶。

你不能只是單純的改變節點內部的值,而是需要實際的進行節點交換。

根據題意,我以為

對鍊錶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...