python排序链表_合并K个排序链表

合并

k

个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。

示例:

输入:[

1->4->5,

1->3->4,

2->6

]输出: 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 = Noneclass Solution(object):

def mergeKLists(self, lists):

"""

:type lists: List[ListNode]

:rtype: ListNode

"""

#合成一个大的listlist然后排序

lists = [x for x in lists if x]        if not lists or all([not x for x in lists]): return

head = lists.pop()

curr = head        while curr.next:

curr = curr.next

while lists:

tmp = lists.pop()

curr.next = tmp            while tmp.next:

tmp = tmp.next

curr = tmp

if not head or not head.next: return head        return self.mergeSort(head)

def mergeSort(self, head):

if not head.next: return head

pre, slow, fast = None, head, head

while fast and fast.next:

prev, slow, fast = slow, slow.next, fast.next.next

prev.next = None

left = self.mergeSort(head)

right = self.mergeSort(slow)        return self.merge(left, right)

def merge(self, left, right):

if not left:            return right        if not right:            return left

if left.val 

res = left

res.next = self.merge(left.next, right)        else:

res = right

res.next = self.merge(left, right.next)        return res

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值