题目:23. 合并K个元素的有序链表
链接:https://leetcode-cn.com/problems/merge-k-sorted-lists/description/
给定K个有序链表,进行合并。
最开始把上面的合并两个有序链表拿来用,结果超时了。于是想到了外部排序里面的败者树,过了。
Python:
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def mergeKLists(self, lists):
"""
:type lists: List[ListNode]
:rtype: ListNode
"""
#处理输入
length = len(lists)
if length==0:
return []
if length==1:
return lists[0]
MAX=0x7fffff
for i in range(length):
if not lists[i]:
lists[i]=(ListNode(MAX))
#losertree
ls = [-1 for i in range(length)]
leaves=lists
def adjustNode(s):
father = (s + length) >> 1
while father > 0:
if (ls[father] == -1 or leaves[s].val > leaves[ls[father]].val) and s >= 0:
s, ls[father] = ls[father], s
father >>= 1
ls[0] = s
def initLoserTree():
for i in range(length-1,-1,-1):
adjustNode(i)
#下面开始计算
initLoserTree()
ret=mergeList=ListNode(-1)
while leaves[ls[0]].val!=MAX:
ret.next=ListNode(leaves[ls[0]].val)
ret=ret.next
if leaves[ls[0]].next==None:
leaves[ls[0]]=ListNode(MAX)
else:
leaves[ls[0]]=leaves[ls[0]].next
adjustNode(ls[0])
return mergeList.next