[劍指Offer] 25_合併兩個排序連結串列
阿新 • • 發佈:2019-01-13
題目
輸入兩個遞增排序的連結串列,合併這兩個連結串列並使新連結串列中的節點仍然使遞增排序的。
例:
L1:1->3->5->7
L2:2->4->6->8
L:1->2->3->4->5->6->7->8
思路
- 兩個指標分別遍歷L1、L2,將較小的連入。思路很簡單,但是程式碼寫出來卻各有差異。
- 時間複雜度:O(n)
- 空間複雜度: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: