题目:
题目链接: https://leetcode-cn.com/problems/merge-k-sorted-lists/
解题思路:
方法一:逐一比较(O(kN))
每次都循环比较当前所有链表首节点的值,然后取最小的值,作为最终链表下个节点的值
重复循环,直到所有链表都加入到最终链表时,退出循环
方法二:暴力法(O(NlogN))
先将所有链表中的值放在一个数组中,然后排序,使用排序后的数组,重新生成一个链表
方法三:逐一比较 + 优先队列(O(Nlogk))
基本与方法一相同,但是使用优先队列辅助,减少的大量的循环比较流程,极大的优化了性能
代码实现:
方法一:
# 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:
head_save = head = ListNode(0)
flag = True
while flag:
flag = False
min_val, min_idx = float('inf'), 0
for index in range(len(lists)):
if not lists[index]:
continue
flag = True
if lists[index].val < min_val:
min_val = lists[index].val
min_idx = index
if flag:
head.next = ListNode(min_val)
head = head.next
lists[min_idx] = lists[min_idx].next
return head_save.next
方法二:
# 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:
val_lst = []
for curr_list in lists:
while curr_list:
val_lst.append(curr_list.val)
curr_list = curr_list.next
head_save = head = ListNode(0)
for curr_val in sorted(val_lst):
head.next = ListNode(curr_val)
head = head.next
return head_save.next
方法三:
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
import queue
class Solution:
def mergeKLists(self, lists: List[ListNode]) -> ListNode:
head_save = head = ListNode(0)
pq = queue.PriorityQueue()
for index, curr_list in enumerate(lists):
if curr_list:
pq.put((curr_list.val, index))
while not pq.empty():
curr_val, curr_index = pq.get()
head.next = ListNode(curr_val)
head = head.next
lists[curr_index] = lists[curr_index].next
if lists[curr_index]:
pq.put((lists[curr_index].val, curr_index))
return head_save.next