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.

  • 相关阅读:
    另类多线程生产者与消费者模式
    redis.conf配置详细翻译解析
    数据库优化之索引使用简介
    Comparable和Comparator的区别
    spring中用到哪些设计模式
    JVM之几种垃圾收集器简单介绍
    angular.extend()和 angular.copy()的区别
    ThreadLocal是什么?保证线程安全
    excel文件怎么使用php进行处理
    ubuntu 安装ssh 服务
  • 原文地址:https://www.cnblogs.com/bonelee/p/12379914.html
Copyright © 2011-2022 走看看