Leetcode演算法——21、合併排序
阿新 • • 發佈:2018-12-16
題目
合併兩個有序連結串列,返回一個新連結串列。即合併排序。
示例: Input: 1->2->4, 1->3->4 Output: 1->1->2->3->4->4
思路
定義兩個指標,分別指向兩個連結串列的head。定義一個空的新連結串列。
然後依次取出指標值,比較大小,將較小值追加到新連結串列,同時將較小值所在連結串列的指標往後移動一位。
如果其中一個指標到頭了,那麼將另一個指標剩下的連結串列直接追加到新連結串列即可。
直至兩個指標都指到了最後一位。
這時候,新連結串列即為合併後的連結串列。
python實現
class ListNode :
def __init__(self, x):
if isinstance(x, list):
self.val = x[0]
self.next = None
head = self
for i in range(1, len(x)):
head.next = ListNode(x[i])
head = head.next
else:
self.val = x
self.next = None
def output(self):
'''
輸出連結串列
'''
result = str(self.val)
head = self.next
while(head is not None):
result += f' -> {head.val}'
head = head.next
return '(' + result + ')'
def mergeTwoLists(l1, l2):
"""
:type l1: ListNode
:type l2: ListNode
:rtype: ListNode
歸併排序。
"""
if not l1:
return l2
if not l2:
return l1
p1 = l1
p2 = l2
head = ListNode(0)
p = head
while(p1 and p2):
if p1.val < p2.val:
p.next = ListNode(p1.val)
p1 = p1.next
else:
p.next = ListNode(p2.val)
p2 = p2.next
p = p.next
if p1:
p.next = p1
elif p2:
p.next = p2
return head.next
if '__main__' == __name__:
l1 = ListNode([1,2,3])
l2 = ListNode([1,3,4])
print(mergeTwoLists(l1,l2).output())