1. 程式人生 > >Leetcode演算法——21、合併排序

Leetcode演算法——21、合併排序

題目

合併兩個有序連結串列,返回一個新連結串列。即合併排序。

示例: 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())