https://leetcode-cn.com/problems/merge-k-sorted-lists/solution/xiong-mao-shua-ti-python3-3chong-jie-fa-bao-li-you/
方法一:暴力法
# 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:
if not lists or len(lists) == 0:
return None
all_vals = []
for l in lists:
while l:
all_vals.append(l.val)
l = l.next
all_vals.sort()
dummy = ListNode(None)
cur = dummy
for i in all_vals:
temp_node = ListNode(i)
cur.next = temp_node
cur = temp_node
return dummy.next
方法二:优先队列(heap)
# 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:
if not lists or len(lists) == 0:
return None
import heapq
heap = []
for node in lists:
while node:
heapq.heappush(heap, node.val)
node = node.next
dummy = ListNode(None)
cur = dummy
while heap:
tmp_node = ListNode(heappop(heap))
cur.next = tmp_node
cur = tmp_node
return dummy.next
方法三:分治法
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def merge(self, node_a, node_b):
dummy = ListNode(None)
cursor_a, cursor_b , cursor_res = node_a, node_b, dummy
while cursor_a and cursor_b:
if cursor_a.val <= cursor_b.val:
cursor_res.next = ListNode(cursor_a.val)
cursor_a = cursor_a.next
else:
cursor_res.next = ListNode(cursor_b.val)
cursor_b = cursor_b.next
cursor_res = cursor_res.next
if cursor_a:
cursor_res.next = cursor_a
if cursor_b:
cursor_res.next = cursor_b
return dummy.next
def mergeKLists(self, lists: List[ListNode]) -> ListNode:
length = len(lists)
if length == 0:
return None
if length == 1:
return lists[0]
mid = length // 2
return self.merge(self.mergeKLists(lists[:mid]), self.mergeKLists(lists[mid:length]))