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...