Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.
Example:
Input: [ 1->4->5, 1->3->4, 2->6 ] Output: 1->1->2->3->4->4->5->6
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None
解题分析:可以依次遍历lists中的每个元素,找到其中的最小值,并将其从对应行去除,循环此操作直到lists中无可用元素。再根据所得值构造所需的返回值即可。
难点:
1.大部分操作的对象为ListNode,需要掌握python中的引用,学会对链表的使用包括删除、遍历、创建、添加等。
2.为了找到最小值,可以将min初始设置为float('inf'),表示为无穷大。
【Version 1】第一次提交代码:
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution(object):
def mergeKLists(self, lists):
"""
:type lists: List[ListNode]
:rtype: ListNode
"""
result = []
while True:
min = float('inf')
flag = 0
for i in range(len(lists)): #找到lists中最小的值
if lists[i] != None:
if lists[i].val < min:
min = lists[i].val
flag = i
if min == float('inf'): #当min的值在遍历结束后仍没改变时,可判断lists中无可用元素
break
result.append(min)
lists[flag] = lists[flag].next #在lists中去除所找到的最小的项
ans = ListNode(0)
cur = ans
for num in result: #构造返回值
cur.next = ListNode(num)
cur = cur.next
ans = ans.next
return ans
问题:第一次提交后发现对于部分输入出现了超时现象,分析后得知,多次迭代后,lists中有许多已为None的元素,这部分元素造成较大开销。
解决办法:每次遍历结束后将lists中为空的行去除。
【Version 2】第二次提交:
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution(object):
def mergeKLists(self, lists):
"""
:type lists: List[ListNode]
:rtype: ListNode
"""
result = []
while True:
min = float('inf')
flag = 0
to_del = []
for i in range(len(lists)):
if lists[i] != None:
if lists[i].val < min:
min = lists[i].val
flag = i
else:
to_del.append(i)
if min == float('inf'):
break
result.append(min)
lists[flag] = lists[flag].next
to_del.reverse()
for i in to_del: #删除空行
del lists[i]
ans = ListNode(0)
cur = ans
for num in result:
cur.next = ListNode(num)
cur = cur.next
ans = ans.next
return ans
最终通过所有测试