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)





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值