https://leetcode.com/problems/merge-k-sorted-lists/description/
题意:合并k(不定)个有序链表
思路1:设计了一个自认为非常巧的暴力法(其实就是solution的第二种方法),思路和两个表合并差不多,每次遍历k个表找最小节点插入新链,找到的第i个链指针前移一位。直到所有链遍历完,还用了一个小技巧,当处理到只剩一条链时,直接加入新链。
让并卵,超时了
class Solution:
def mergeKLists(self, lists):
"""
:type lists: List[ListNode]
:rtype: ListNode
"""
head = ListNode(0)
work = head
available = [] #用于表示每条链是否空的状态表
for i in range(len(lists)):
if lists[i]:
available.append(True)
else:
available.append(False)
while sum(available) > 1: #注意布尔值列表也可以用sum求和
min = sys.maxsize #最小值,初始为py的最大数
index = -1 #最小值所在链,初始-1
for i in range(len(lists)):
if not lists[i]: #遇到空链则跳过
available[i] = False
continue
if lists[i].val < min:
min = lists[i].val
index = i
if index != -1: #若能找到最小值
work.next = lists[index]
work = lists[index]
lists[index] = lists[index].next
#对最后一条链表特殊处理
for i, a in enumerate(available): #找到非空链的下标i
if a:
work.next = lists[i]
return head.next
思路2:soluition第一种的暴力法,真心暴力,直接遍历每条链的每个节点,把所有值记录下来。然后排序,根据排序后的序列构建出一条新链来。。。。
class Solution():
def mergeKLists(self, lists):
"""
:type lists: List[ListNode]
:rtype: ListNode
"""
nodes = []
head = point = ListNode(0)
for l in lists:
while l:
nodes.append(l.val)
l = l.next
nodes.sort() #排序
for x in nodes:
point.next = ListNode(x)
point = point.next
return head.next