当前位置: 首页 > 知识库问答 >
问题:

LeetCode:问题23-合并K个排序列表

田博易
2023-03-14

LeetCode上说明的问题如下:

合并k个排序链表,并将其作为一个排序列表返回。分析并描述其复杂性。

例子:

输入:[1-

我能够通过131个测试案例中的129个,但在案例130中达到了“超出时间限制”。下面是我的实现。

有人能发现瓶颈吗?对提高时间复杂度有什么建议吗?

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

class Solution:
    # def print_lists(self, lists):
    #     idx = 0
    #     while idx < len(lists):
    #         ptr = lists[idx]
    #         _l = []
    #         while ptr is not None:
    #             _l.append(ptr.val)
    #             ptr = ptr.next
    #         idx += 1
    #         print(_l)

    def min_idx(self, lists):
        idx = 0

        for i in range(len(lists)):
            if lists[i] is None:
                continue
            elif lists[idx] is None:
                idx = i
            elif lists[i].val < lists[idx].val:
                idx = i
        return idx

    def mergeKLists(self, lists: List[ListNode]) -> ListNode:
        head = tail = ListNode(-1)

        while len(lists) > 0:
            m_idx = self.min_idx(lists)

            if lists[m_idx] is None:
                return head.next

            tail.next = lists[m_idx]
            tail = tail.next
            lists[m_idx] = lists[m_idx].next

            if lists[m_idx] is None:
                del lists[m_idx]

        return head.next

我在没有使用del的情况下遇到了超过时间限制的问题。测试用例130包含10,000个LinkedList。

共有1个答案

齐磊
2023-03-14

下面是一个更简单、更快速的代码版本,它避免了几个if:

def min_idx(self, lists):
    idx = 0

    for i in range(len(lists)):
        if lists[i].val < lists[idx].val:
            idx = i
    return idx

def mergeKLists(self, lists):
    head = tail = ListNode(-1)

    lists = list(filter(lambda x: x is not None, lists))

    while len(lists) > 0:
        m_idx = self.min_idx(lists)

        tail.next = lists[m_idx]
        tail = tail.next
        lists[m_idx] = lists[m_idx].next

        if lists[m_idx] is None:
            del lists[m_idx]

    return head.next

为了获得更好的效果,您需要将实现更改为:

  • 使用heap将min_idx操作减少到O(log k),而不是O(k)是列表的数量
 类似资料:
  • 我有一个关于python中链接列表的快速问题。在下面显示的解决方案代码中,当我尝试合并两个排序的链接列表时。我对包含的if和elif语句的条件感到困惑。例如,如果l1不为空,l2为空,我想将l1中的其余3个元素添加到我的新链接列表中,但代码显示l1和tail没有更新,所以它不是只添加3个元素中的一个吗? 我的另一个问题是关于返回head.next.返回会自动返回从head.next到null pt

  • 我收到一份作业,要求我将总共有N个元素的K个排序列表有效地合并到一个排序列表中。我偶然发现的方法是使用最小堆对K列表中的元素进行排序,或者使用分而治之的方法(成对合并)。该线程中的注释表明,分而治之方法的时间复杂度为O(NK),而最小堆方法的时间复杂度为O(N log K),两者的空间复杂度相同。我还访问了许多其他线程,但我不能得到一个清晰的图片。 怀疑 许多其他网站告诉我们,两者都存在分歧

  • 快速选择 堆 1. Kth Element 桶排序 1. 出现频率最多的 k 个元素 2. 按照字符出现次数对字符串排序 荷兰国旗问题 1. 按颜色进行排序 快速选择 用于求解 Kth Element 问题,也就是第 K 个元素的问题。 可以使用快速排序的 partition() 进行实现。需要先打乱数组,否则最坏情况下时间复杂度为 O(N2)。 堆 用于求解 TopK Elements 问题,也

  • 我正试图想出一个分而治之的算法来合并j个排序列表和n个元素,但我被卡住了;我不知道如何把这个问题分成更小的子问题。我希望合并算法更高效,如下所示: 合并前两个列表;然后将结果列表与第三个列表合并;然后将结果列表与第四个列表合并,以此类推,该列表取O(j*jn)。

  • 我想写一个时间O(n*lgk)的算法,将k个排序数组合并成一个排序数组,其中n是所有输入数组的元素总数。 你能告诉我怎么做吗? 编辑:我编写了以下算法: 你能告诉我这是否正确吗?

  • 我已经阅读并理解了Mergesort的工作原理(作为文本),现在我正在尝试对其进行编码。我已经完成了分割数据的部分(我使用向量),直到它的每个大小都为1。现在我已经在Mergesort中为另一个所需部分编写了代码,我不知道该如何调用它,但我只是称它为“比较和排序部分”。 你有两个向量,这个部分应该比较最开始的元素,取较小的元素,然后删除选择的元素,把它放入一个新的向量中。这样做,直到两个向量的大小