Python 合併兩個有序鍊錶 題目描述

2021-10-02 01:50:10 字數 2792 閱讀 1735

1.合併兩個有序鍊錶 題目描述

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

示例:輸入:1->2->4, 1->3->4

輸出:1->1->2->3->4->4

class

listnode

:def

__init__

(self, x)

: self.val = x

self.

next

=none

class

solution

:def

mergetwolists

(self, l1, l2)

:"""

:type l1: listnode

:type l2: listnode

:rtype: listnode

"""if l1 is

none

and l2 is

none

:return

none

new_list = listnode(0)

pre = new_list

while l1 is

notnone

and l2 is

notnone

:if l1.val < l2.val:

pre.

next

= l1

l1 = l1.

next

else

: pre.

next

= l2

l2 = l2.

next

pre = pre.

next

if l1 is

notnone

: pre.

next

= l1

else

: pre.

next

= l2

return new_list.

next

首先,因為之前不是很懂python裡鍊錶這種表示方法,經過一些**實操,現在明白了,

在第乙個listnode這種類表示方法裡,如果只有init這個定義函式,那這個類的例項化對

象只能表示乙個節點,它雖然具有初始節點值,也有.next這個定義,但沒有接下來其他

類函式去定義節點關係,那它就只能表示乙個節點。仔細看下面

head1 = listnode(2)

n1 = listnode(3)

n2 = listnode(4)

n3 = listnode(9)

head1.

next

= n1

n1.next

= n2

n2.next

= n3

head2 = listnode(3)

m1 = listnode(5)

m2 = listnode(7)

m3 = listnode(8)

head2.

next

= m1

m1.next

= m2

m2.next

= m3

第一段**其實定義了兩個有序鍊錶,分別是2-->3-->4-->9和3-->5-->7-->8,因為listnode類的例項化物件只是節點,所以上面

所做的就是把分別定義四個節點,然後通過python裡面的這種"="賦值方法把節點依次傳遞下去,比如head1的下乙個節點是

我們再回到解法裡面,l1和l2其實是兩個鍊錶的頭節點,當他們都不存在的時候,那就直接返回none了,沒毛病;然後,

new_list = listnode(0)這個意思是構造乙個初始節點,也就是新鍊錶的初始節點,其實可以把new_list理解為根節點;接著下一

步是pre = new_list,這一步很關鍵,因為如果不賦值的話,讓new_list自身去不斷next傳遞節點關係,那根節點就找不到了,所

以需要先把new_list儲存,接著進行乙個while迴圈,條件是l1和l2這兩個節點都不能為空,也就是說在兩個鍊錶長度範圍之內遍

歷,當l1(初始是鍊錶1的頭節點)的值小於l2的值,那就把pre的指向l1,其實也就是new_list指向了l1,下面的步驟應該不難理

解了;最後迴圈結束了,肯定是其中有乙個鍊錶被遍歷完了,也就是l1或者l2傳遞到了這兩個鍊錶的尾節點,沒法再next下去

了。 跳出迴圈,此時來到了接下來的if l1 is not none:這個判斷條件,我們假設遍歷完以後, l1所在的鍊錶1還有剩餘的幾個節

點,l2所在的鍊錶2已經遍歷完了,那麼pre.next = l1這個意思就是把pre引向l1之後的那幾個節點,也就是把新鍊錶跟剩下 的鍊錶

連線起來最後return的是new_list.next,因為new_list是根節點,new_list.next才是頭節點!

還有就是用while即時遍歷後,head1頭指標最後指向空,整個鍊錶也就沒了,不存在val和next位址了

s = solution(

)newlist = s.mergetwolists(head1,head2)

while newlist:

print

(newlist.val,end=

" ")

newlist = newlist.

next

2 3 3 4 5 7 8 9

合併兩個有序鍊錶

鍊錶的題目總是讓我很惆悵。動輒就會runtime error。比如這題,額外用了乙個節點的空間來儲存頭節點。我很不情願多用這個空間,不過貌似不行。貌似不行,實際可行,見附錄。把頭節點提出迴圈 實現類 class solution else if l1 null p next l1 if l2 nul...

合併兩個有序鍊錶

三個指標乙個儲存la鍊錶 乙個儲存lb鍊錶,乙個指向新的鍊錶。鍊錶的插入,兩個指標,乙個是head,乙個指向head後面的鏈,新插入的元素位於head後面。執行該 自己外加上class類。static class node public static void main string args st...

合併兩個有序鍊錶

將兩個有序鍊錶合併為乙個新的有序鍊錶並返回。新煉表是通過拼接給定的兩個鍊錶的所有節點組成的。示例 輸入 1 2 4,1 3 4 輸出 1 1 2 3 4 4思路 很簡單就是二路歸併的思想,時間複雜度o n definition for singly linked list.struct listno...