【问题标题】:When performing a union operation on two non-ordered linked lists, can the time complexity be O(1)?对两个无序链表进行并集运算时,时间复杂度可以为O(1)吗?
【发布时间】:2020-03-03 22:05:17
【问题描述】:

我目前有一种方法可以将一个链表 (list2) 附加到另一个链表 (list1) 的末尾。它通过一个 while 循环来执行此操作,每次迭代都将 list1 中的下一个节点附加到 list2 的末尾,依此类推。

我的理解是,这将是 O(n) 时间复杂度,因为 while 循环中的迭代次数直接由 list2 的大小决定。如果list2有15个节点,函数执行15次追加,如果list2有1000个节点,函数执行1000次追加。

然而,我经常看到人们注意到,如果你保留一个指向 list1 尾部的指针,这个联合可以在 O(1) 时间复杂度内执行。这怎么可能?根据我(诚然有限)的理解,我可以在一定程度上理解单个追加是 O(1),但是如果您要追加整个列表,它是否需要在 while 循环中并扫描所有 list2 无论如何,因此O(n)?

【问题讨论】:

    标签: algorithm while-loop linked-list time-complexity complexity-theory


    【解决方案1】:

    这里的关键是您不需要附加整个列表。 list2已经是一个链表,每个元素都链接到下一个元素,所以如果你的列表包含对第一个和最后一个元素的引用,你真正需要做的就是将它们链接在一起。在伪代码中:

    list1.tail.next = list2.head
    union.head = list1.head
    union.tail = list2.tail
    

    【讨论】:

    • 啊,这非常有用。我从未考虑过 list2 已经全部连接的事实。所以我所做的就是改变我在 list1 中的尾部所指向的内容,而不是 null 它是 list2 的头部。这是一个非常简洁的解释。谢谢。
    • 注意,为了得到list1的尾指针,我们需要遍历到它的末尾,这需要O(n)。
    • @ZhaoGang 这取决于你的实现。您可以很容易地实现一个 LinkedList,它不仅保存和维护头指针,而且还保存尾指针。我对 O(1) 解决方案的假设是这种实现(“如果您的列表包含对第一个和最后一个元素的引用”),就像 OP 一样(“我一直看到人们注意到可以执行此联合如果您保留指向 list1 尾部的指针,则时间复杂度为 O(1)")
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-25
    • 2021-03-13
    • 1970-01-01
    相关资源
    最近更新 更多