问题
解答
1.暴力解法
非常快乐,把链表每个结点中的值放入到一个列表,用python中的sorted()
函数将列表排序,再按顺序将列表中的元素放入新的有序链表中。
时间复杂度:O(NlogN)
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def mergeKLists(self, lists: List[ListNode]) -> ListNode:
self.nodes=[]
for lst in lists:
while lst:
self.nodes.append(lst.val)
lst = lst.next
dummyHead = point = ListNode(0)
for x in sorted(self.nodes):
point.next = ListNode(x)
point = point.next
return dummyHead.next
击败用户
2.优先队列
使用堆数据结构的知识,引用heapq
,将最小的节点接在输出的有序链表后面。
时间复杂度: O(Nlogk)
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
import heapq
class Solution:
def mergeKLists(self, lists: List[ListNode]) -> ListNode:
dummy = ListNode(0)
p = dummy
head = []
for i in range(len(lists)):
if lists[i] :
heapq.heappush(head, (lists[i].val, i))
lists[i] = lists[i].next
while head:
val, node = heapq.heappop(head)
p.next = ListNode(val)
p = p.next
if lists[node]:
heapq.heappush(head, (lists[node].val, node))
lists[node] = lists[node].next
return dummy.next
击败用户