1. 程式人生 > >[劍指Offer] 25_合併兩個排序連結串列

[劍指Offer] 25_合併兩個排序連結串列

題目

輸入兩個遞增排序的連結串列,合併這兩個連結串列並使新連結串列中的節點仍然使遞增排序的。

例:

L1:1->3->5->7
L2:2->4->6->8
L:1->2->3->4->5->6->7->8


思路

  1. 兩個指標分別遍歷L1、L2,將較小的連入。思路很簡單,但是程式碼寫出來卻各有差異。
    1. 時間複雜度:O(n)
    2. 空間複雜度:O(1)

程式碼

思路1:

def merge_sorted_lists
( l1, l2): """ :param l1: ListNode 1 head :param l2: ListNode 2 head :return: merged L head """ if not l1 or not l2: return l1 or l2 if l1.val <= l2.val: main = l1 sub = l2 else: main = l2 sub = l1 last = main while sub and
last.next: if last.next.val <= sub.val: pass else: temp = last.next last.next = sub sub = temp last = last.next last.next = sub return main def merge_sorted_lists_2(l1, l2): if not l1 or not l2: return l1 or
l2 sham_head = ListNode(0) sham_head.next = l1 node = sham_head while node.next: if node.next.val > l2.val: node.next, l2 = l2, node.next node = node.next node.next = l2 return sham_head.next def merge_sorted_lists_3(l1, l2): sham_head = ListNode(0) node = sham_head while l1 and l2: if l1.val < l2.val: node.next = l1 l1 = l1.next else: node.next = l2 l2 = l2.next node = node.next node.next = l1 or l2 return sham_head.next

思考

第1個函式是我以前做LeetCode時候寫的,有很多不必要的語句。
第2個函式用了假頭略去了第一次單獨判斷大小,程式碼簡潔了點,但是仍然需要單獨處理空輸入。
第3個函式,邏輯清晰,程式碼簡潔。
附LeetCode:

LeetCode 21. 合併兩個有序連結串列