力扣的合并K个排序链表解法
题目描述:
合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。
示例:
输入:
[
1->4->5,
1->3->4,
2->6
]
输出: 1->1->2->3->4->4->5->6
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/merge-k-sorted-lists
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
参考程序1:
# 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:
result = []
for i in lists:
while i :
result.append(i.val)
i = i.next
if result == []:
return []
result.sort()
line1 = ListNode(0)
line2 = line1
while result:
line1.next = ListNode(result.pop(0))
line1 = line1.next
return line2.next
运行结果1:
参考程序2:
# 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 lists is None or len(lists) == 0:
return None
while len(lists) > 1:
temp = []
for i in range(0, len(lists) - 1, 2):
p = self.mergeTwoList(lists[i], lists[i + 1])
temp.append(p)
if len(lists) % 2 == 1:
temp.append(lists[-1])
lists = temp
return lists[0]
def mergeTwoList(self, line1, line2):
if line1 is None:
return line2
if line2 is None:
return line1
result = ListNode(0)
r = result
while line1 is not None and line2 is not None:
if line1.val <= line2.val:
r.next = line1
line1 = line1.next
else:
r.next = line2
line2 = line2.next
r = r.next
if line1 is not None:
r.next = line1
if line2 is not None:
r.next = line2
return result.next
运行结果2:
参考程序3:
# 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:
import heapq
result = ListNode(-1)
r = result
line = list()
temp = 0
for i in lists:
while i:
heapq.heappush(line, (i.val, temp, i))
i = i.next
temp += 1
while line:
r.next = heapq.heappop(line)[2]
r = r.next
return result.next
运行结果3: