python實現合併兩個有序列表

2021-10-18 21:24:24 字數 2700 閱讀 5339

兩個公升序鍊錶合併為乙個新的公升序鍊錶並返回。新煉表是通過拼接給定的兩個鍊錶的所有節點組成的。

輸入:l1 = [1,2,4], l2 = [1,3,4]

輸出:[1,1,2,3,4,4]

輸入:l1 = , l2 =

輸出:

輸入:l1 = , l2 = [0]

輸出:[0]

因為leetcode伺服器上已經封裝了鍊錶類,在本地測試時我需要自己來實現鍊錶類,**如下

class

listnode

:def

__init__

(self, val,

next

=none):

ifisinstance

(val,

int)

: self.val = val

self.

next

=next

elif

isinstance

(val,

list):

self.val = val[0]

self.

next

=none

head = self

for i in

range(1

,len

(val)):

node = listnode(val[i]

,none

) head.

next

= node

head = head.

next

遞迴法的思路比較簡單,我們需要先判斷鍊錶l1鍊錶l2是否為空,如果為空直接返回另乙個鍊錶即可就不需要進行比較了。如果不為空,我們就需要比較鍊錶節點的值誰的更大,如果l1大於l2我們就更改鍊錶l2的下乙個節點,然後再比較l2的下乙個節點和l1,反之可得另一種情況的處理方法。

class

solution

:def

mergetwolists

(self, l1: listnode, l2: listnode)

-> listnode:

#如果鍊錶l1為none直接返回鍊錶l2即可

if l1 is

none

:return l2

#如果鍊錶l2為none直接返回鍊錶l1即可

elif l2 is

none

:return l1

#如果鍊錶l1大於鍊錶l2

elif l1.val > l2.val:

#更改鍊錶l2下乙個節點的指向

l2.next

= self.mergetwolists(l1,l2.

next

)return l2

else

:#更改鍊錶l1下乙個節點的指向

l1.next

= self.mergetwolists(l1.

next

,l2)

return l1

l1 = listnode([1

,2,4

])l2 = listnode([1

,3,4

])s = solution(

)l = s.mergetwolists(l1,l2)

while l:

print

(l.val)

l = l.

next

這個演算法更簡單了,我們只需要遍歷鍊錶l1和l2然後再比較大小即可,對於最後沒遍歷完的部分,直接追加到合併鍊錶的後面即可。

class

solution

:def

mergetwolists

(self, l1: listnode, l2: listnode)

-> listnode:

#用來合併鍊錶

prehead = listnode(-1

)#建立乙個哨兵節點

pre = prehead

while l1 and l2:

if l1.val > l2.val:

pre.

next

= l2

l2 = l2.

next

else

: pre.

next

= l1

l1 = l1.

next

#更改哨兵節點的下乙個指向

pre = pre.

next

pre.

next

= l1 if l1 else l2

return prehead.

next

l1 = listnode([1

,2,4

])l2 = listnode([1

,3,4

])s = solution(

)l = s.mergetwolists(l1,l2)

while l:

print

(l.val)

l = l.

next

參考:合併兩個有序鍊錶

合併兩個有序列表

1.尾遞迴 1 def recursion merge sort2 l1,l2,tmp 2if len l1 0 or len l2 0 3tmp.extend l1 4tmp.extend l2 5return tmp6 else 7 if l1 0 dell1 0 10else 11 12del...

Go實現合併兩個有序列表(leetcode 21)

將兩個有序鍊錶合併為乙個新的有序鍊錶並返回。新煉表是通過拼接給定的兩個鍊錶的所有節點組成的。示例 輸入 1 2 4,1 3 4 輸出 1 1 2 3 4 4 如下 definition for singly linked list.type listnode struct func mergetwo...

go合併兩個有序列表

題目 將兩個有序鍊錶合併為乙個新的有續鍊錶並返回。新煉表是通過拼接給定的兩個鍊錶的所有節點做成的。思路 1 如果給定的兩條鍊錶中有一條為空,返回另一條即可 2 若兩條鍊錶都不為空,則在兩條鍊錶中選擇較小的節點作為head,被選中的較小節點所在鍊錶的第二個節點便成了二當家帶領這條鍊錶 3 二當家帶領著...