本题与merge2 sorted linked lists很类似,也自然的想到了调用之前实现的的方法。在网上看了一些python的解决方案,有提到最小堆的,感觉有点晦涩难懂,并且运用了python自带的heap函数,一般工作中比较难遇到,也难想到。
作者开始的思路是,先实现2 sorted linked lists 函数,然后再对lists做一个for循环,每次将一个list合并到已经排好序的list中,这样做逻辑没问题,但是会超时,愿因合并后的list的length比较大,每次比较的次数多。
改进的方案是先将短的list合并,再将合并后的list合并,减少比较次数。思路找对,写完就一次通过,比较surprise.
读题:
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.
思路:
# Definition for singly-linked list. # class ListNode(object): # def __init__(self, x): # self.val = x # self.next = None class Solution(object): def twoLists(self,list1,list2): """之前的2sorted list merge的方法copy过来""" rtn = ListNode(0) head = rtn while list1!=None or list2!=None: if list1!=None and list2!=None: if list1.val < list2.val: rtn.next = list1 list1 = list1.next rtn = rtn.next else: rtn.next = list2 list2 = list2.next rtn = rtn.next elif list1!=None: rtn.next = list1 break else: rtn.next = list2 break return head.next def merge2List(self,l1s):#递归函数调用 if not l1s: return None if len(l1s)<2: return l1s[0] if len(l1s) == 2:#递归终止条件 return self.twoLists(l1s[0],l1s[1]) else:#每次将lists均分成两组,分别作merge,再合并 return self.twoLists(self.merge2List(l1s[:len(l1s)/2]),self.merge2List(l1s[len(l1s)/2:])) def mergeKLists(self, lists): """ :type lists: List[ListNode] :rtype: ListNode """ return self.merge2List(lists)