zoukankan      html  css  js  c++  java
  • python 合并k个有序链表

    from heapq import heappush, heappop
    
    
    class Solution:
        def mergeKLists(self, lists):
            q = []
            for i,head in enumerate(lists):
                if head:
                    heappush(q, (head.val, i, head))
    
            node = dummy = ListNode(0)
            while q:
                val, i, pop_node = heappop(q)
                print(val)
                node.next = ListNode(val)
                node = node.next
                next_node = pop_node.next
                if next_node:
                    heappush(q, (next_node.val, i, next_node))
            return dummy.next
    

      

     为啥有i???????????理由见后、

    另外PQ也有这个问题

    # Definition for singly-linked list.
    # class ListNode:
    #     def __init__(self, x):
    #         self.val = x
    #         self.next = None
    import queue
    
    
    class Solution:
        def mergeKLists(self, lists: List[ListNode]) -> ListNode:
            q = queue.PriorityQueue()
            for i,head in enumerate(lists):
                if head:
                    q.put((head.val, i, head))
            
            node = dummy = ListNode(0)
            while not q.empty():
                val, i, pop_node = q.get()
                node.next = ListNode(val)
                node = node.next
                next_node = pop_node.next
                if next_node:
                    q.put((next_node.val, i, next_node))
            return dummy.next
    

      

    python 3 heappush Line 13: TypeError: '<' not supported between instances of 'ListNode' and 'ListNode'

    出现原因:

    @cbmbbz In the event that two or more of the lists have the same val, this code will error out since the queue module will compare the second element in the priority queue which is a ListNode object (and this is not a comparable type).

    To solve for this issue, I have stored (node.val, list_idx, node) to account for this edge case.

    from queue import PriorityQueue
    # Definition for singly-linked list.
    # class ListNode:
    #     def __init__(self, x):
    #         self.val = x
    #         self.next = None
    
    class Solution:
        def mergeKLists(self, lists):
            k = len(lists)
            q = PriorityQueue(maxsize=k)
            dummy = ListNode(None)
            curr = dummy
            for list_idx, node in enumerate(lists):
                if node: q.put((node.val, list_idx, node))
            while q.qsize() > 0:
                poped = q.get()
                curr.next, list_idx = poped[2], poped[1]
                curr = curr.next
                if curr.next: q.put((curr.next.val, list_idx, curr.next))
            return dummy.next
    
     
     
    48
     
    Show 4 replies
    Reply
    Share
    Report
    Read More

    Python3 env will get TypeError: '<' not supported between instances of 'ListNode' and 'ListNode'
    if there are duplicate values in the list. Works in Python env.

  • 相关阅读:
    AndroidStudio gradle配置
    Git中pull对比fetch和merge
    Knockout.js随手记(7)
    Knockout.js随手记(6)
    MVC自动绑定整数数组
    Knockout.js随手记(5)
    ASP.NET4.5Web API及非同步程序开发系列(3)
    Knockout.js随手记(4)
    ASP.NET4.5Web API及非同步程序开发系列(2)
    ASP.NET4.5Web API及非同步程序开发系列(1)
  • 原文地址:https://www.cnblogs.com/bonelee/p/12379914.html
Copyright © 2011-2022 走看看