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.

  • 相关阅读:
    atom 安装插件列表
    django学习
    windows 安装 python3
    python3 监控代码变化 自动重启 提高开发效率
    git无法pull仓库refusing to merge unrelated histories
    python 项目部署virtualenv
    python 多线程并发threading & 任务队列Queue
    python logging 日志使用
    jupyter 教程
    mysql 替换数据库字段内容
  • 原文地址:https://www.cnblogs.com/bonelee/p/12379914.html
Copyright © 2011-2022 走看看