leetcode23. Merge k Sorted Lists # #python

本题与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)





你可能感兴趣的:(技术面试)