兩種解法:
1. 調用merge two sorted lists,一次merge兩個鏈表,直到全部merge爲一個鏈表。設每個鏈表長度爲n,共k個鏈表,時間復度通過兩數值的比較次數計算:,空間複雜度爲。
2. 採用堆數據結構,將所有鏈表中的最小元素加入有序堆,當一個最小元素被加入結果鏈表後,將該最小元素所在鏈表的下一節點值加入該堆,直至堆爲空。插入過程最少查找時間複雜度爲,則整體時間複雜度爲,因爲一共nk個元素,每加入一個元素需要至少log(k)次比較操作。
3. 每次merge兩個鏈表,使鏈表總數成下降,則每個循環鏈表長度成上升,時間複雜度爲
Python源碼:
Runtime: 108 ms, faster than 48.52% of Python online submissions for Merge k Sorted Lists.
Memory Usage: 17.4 MB, less than 71.21% of Python online submissions for Merge k Sorted Lists.
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution(object):
def mergeKLists(self, lists):
"""
:type lists: List[ListNode]
:rtype: ListNode
"""
if not lists:
return None
end = len(lists) - 1
while(end > 0):
begin = 0
while begin < end:
lists[begin] = self.merge2Lists(lists[begin], lists[end])
begin += 1
end -= 1
return lists[0]
def merge2Lists(self, l1, l2):
dummy = ListNode(0)
p = dummy
while l1 != None and l2 != None:
if l1.val < l2.val:
p.next = l1
l1 = l1.next
else:
p.next = l2
l2 = l2.next
p = p.next
if l1 != None:
p.next = l1
elif l2 != None:
p.next = l2
return dummy.next
我的心路:
又是一個不太Hard的Hard題。思路很直接,每次獲取當前所有node中值最小的node,加入返回序列的下一個,並將列表中此node賦值爲其下一節點,如果該節點爲空,則從列表中刪去該節點。在遍歷之前先刪去了列表中爲空的節點。該方法的時間複雜度按比較次數計算,總共有元素nk個,每添加一個元素到結果鏈表中,需要在k個無序元素中找出最小的——k-1次比較,然後在k個元素中查找該值所在位置——k/2次查找,整體時間複雜度爲,空間複雜度爲。
Runtime: 3748 ms, faster than 10.15% of Python online submissions for Merge k Sorted Lists.
Memory Usage: 17.4 MB, less than 71.21% of Python online submissions for Merge k Sorted Lists.
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution(object):
def mergeKLists(self, lists):
"""
:type lists: List[ListNode]
:rtype: ListNode
"""
dummy = ListNode(0)
cur = dummy
i = 0
j = 0
for i in range(len(lists)):
if lists[j] == None:
lists.pop(j)
j -= 1
j += 1
while(lists):
cur_vals = [node.val for node in lists]
idx = cur_vals.index(min(cur_vals))
cur.next = lists[idx]
cur = cur.next
lists[idx] = lists[idx].next
if lists[idx] == None:
lists.pop(idx)
return dummy.next