劍指offer 合併兩個有序鍊錶 python

2021-09-10 08:26:05 字數 2802 閱讀 6799

方法一:迭代(簡化)

方法二:遞迴

題目:

將兩個有序鍊錶合併為乙個新的有序鍊錶並返回。

題目位置

**位置

示例:

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

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

class solution(object):

def mergetwolists(self, l1, l2):

""":type l1: listnode

:type l2: listnode

:rtype: listnode

"""currentnode = tempnode = listnode(0)

if not l1 and not l2:

return none

while l1 and l2:

if l1.val <= l2.val:

currentnode.next = l1

l1 = l1.next

else:

currentnode.next = l2

l2 = l2.next

currentnode = currentnode.next

if l1 or l2:

currentnode.next = l1 or l2

return tempnode.next

listnode(0)這個是什麼意思?

剛開始我也懵,仔細看了下。發現這是個例項化的東西。leetcode題目前面有個listnode的類的定義,初始化時需要傳進去乙個值。

# class listnode(object):

# def __init__(self, x):

# self.val = x

# self.next = none

我們做題目時,其實沒有用到這個例項化的值,也就是說listnode括號裡面的0,也可以是100,20,3這些,我們實際不會用到,我們最後返回的是(return tempnode.next)這個節點以後的那些節點。

方法一是沒有動原來的l1和l2鍊錶,重新搞了乙個新煉表放這個排序,而鍊錶嘛,首先要有個頭不是嘛,listnode(0)就是新建了乙個頭,後面自己加節點,自己玩兒去~ 反正最後這個頭不跟你們走~

漲姿勢的寫法:currentnode.next = l1 or l2

if l1 or l2:

currentnode.next = l1 or l2

這種寫法沒見過。自己先測試一下:

>>> a = [1,2,3]

>>> b =

>>> if a or b:

... print(a or b)

...[1, 2, 3]

發現這個是真的,記下來哦,不要再傻傻的用if…else了。

class solution(object):

def mergetwolists(self, l1, l2):

""":type l1: listnode

:type l2: listnode

:rtype: listnode

"""currentnode = tempnode = listnode(0)

while l1 and l2:

if l1.val < l2.val:

currentnode.next = l1

l1 = l1.next

else:

currentnode.next = l2

l2 = l2.next

currentnode = currentnode.next

currentnode.next = l1 or l2

return tempnode.next

無意中看到乙個更簡潔的版本,本著少寫一行是一行的原則(因為懶),可以將方法一的**簡化一下。

如果l1l2都不存在,直接return tempnode.next,而tempnode.next就是為空的。下面的**就會出現重複,去掉吧。

if not l1 and not l2:

return none

還有,將下面的**

if l1 or l2:

currentnode.next = l1 or l2

替換為:

currentnode.next = l1 or l2
是不是很簡單,少寫了三行**哦~

class solution(object):

def mergetwolists(self, l1, l2):

""":type l1: listnode

:type l2: listnode

:rtype: listnode

"""if not l1 or not l2:

return l1 or l2

while l1 and l2:

if l1.val < l2.val:

l1.next = self.mergetwolists(l1.next,l2)

return l1

else:

l2.next = self.mergetwolists(l1,l2.next)

return l2

劍指offer 合併兩個有序鍊錶

依次比較兩個鍊錶的首結點,取較小的的結點放到第三個鍊錶尾,同時移動較小節點所在鍊錶的指標指向下乙個節點。步驟一結果會有乙個鍊錶先遍歷結束 第三個鍊錶尾結點指向剩餘未遍歷結束的鍊錶 返回第三個鍊錶首結點 struct listnode class solution else merlist merli...

劍指offer 合併兩個有序鍊錶

題目描述 輸入兩個單調遞增的鍊錶,輸出兩個鍊錶合成後的鍊錶,當然我們需要合成後的鍊錶滿足單調不減規則。參考思路 逐個比較兩個鍊錶的第乙個結點,將結點值小的那個結點新增到乙個新的鍊錶上。直到最後乙個兩個鍊錶都合併到新的鍊錶上結束。參考 public class listnode public clas...

劍指OFFER 合併兩個有序的鍊錶

輸入兩個單調遞增的鍊錶,輸出兩個鍊錶合成後的鍊錶,當然我們需要合成後的鍊錶滿足單調不減規則。再做這道題就是想不起來書上怎麼做的了,但是最近看stl裡面全是這種基礎的合併啊,比較啊。就算不會也看會了。迴圈我用了4個指標。p和q分別指向兩個鍊錶當前需要比較的元素,l和k分別代表 新 的鍊錶的舊節點和新節...