leetcode-23-合并K个有序链表*

题目描述:

 

 方法一:分治 O(kn*logk) O(logk)

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def mergeKLists(self, lists: List[ListNode]) -> ListNode:
        if not lists:return 
        return self.merge(lists,0,len(lists)-1)
    def merge2lists(self,l1,l2):
        if not l1:return l2
        if not l2:return l1
        if l1.val<l2.val:
            l1.next = self.merge2lists(l1.next,l2)
            return l1
        else:
            l2.next = self.merge2lists(l1,l2.next)
            return l2
    def merge(self,lists,left,right):
        if left==right:
            return lists[left]
        mid = (right-left)//2 + left
        l1 = self.merge(lists,left,mid)
        l2 = self.merge(lists,mid+1,right)
        return self.merge2lists(l1,l2)

方法二:优先级队列O(kn*logk) O(k)

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def mergeKLists(self, lists: List[ListNode]) -> ListNode:
        import heapq
        dummy = ListNode(0)
        p = dummy
        head = []
        for i in range(len(lists)):
            if lists[i] :
                heapq.heappush(head, (lists[i].val, i))
                lists[i] = lists[i].next
        while head:
            val, idx = heapq.heappop(head)
            p.next = ListNode(val)
            p = p.next
            if lists[idx]:
                heapq.heappush(head, (lists[idx].val, idx))
                lists[idx] = lists[idx].next
        return dummy.next

 

posted @ 2019-10-10 10:23  oldby  阅读(145)  评论(0编辑  收藏  举报