在O(1)中将链表添加到另一个

时间:2012-10-15 18:35:56

标签: java data-structures linked-list

两个单个链接列表,大小为m,r并且希望在第二个链表的头部之后插入第一个链表节点,并且时间复杂度必须为O(1)方法

这对我来说真的是一个令人困扰的难题。 Eatch时间我想到一个解决方案,时间复杂度是O(m + r)

我需要一些提示来解决这个问题。我在这个问题上耗费了无用的精力。

编辑:

让我分享一下到目前为止:

  1. 创建新的链接列表
  2. 添加第二个列表的HEAD
  3. 仍然是O(1)
  4. 添加第一个列表的所有节点
  5. 成为(n)
  6. 添加第一个列表中的其余节点

  7. 成为另一个(n-1)

  8. 更新:

    您如何看待这个?我问到这里后,我直接受到了启发:) enter image description here

2 个答案:

答案 0 :(得分:4)

如果你有两个单链表并且没有第一个的尾部,那么这只能用于O(n)。如果你有尾巴,你只需指向第二个清单的头部......

编辑:第二个列表头指向第一个列表的头部。保持对第二个列表的第二个节点的引用。迭代第一个列表 - 如果你没有引用尾部的引用,那么这是O(n) - 并且将该点的尾部指向第二个列表的原始第二个元素。

答案 1 :(得分:0)

假设你有这些结构:

  • 列表
    • 头节点
    • 尾节点
  • 节点
    • 下一个节点

提醒自己:目标是:“在第二个链表的头部之后插入第一个链表节点”。

然后你所要做的就是:

// Hook up the end of list1 to the original second element of list2
list1.tail.next = list2.head.next;
// Set the second element of list2 to be the first element of list1
list2.head.next = list1.head;

List2仍然以前的位置结束(尾节点相同)。

你现在list1有一个“漂浮”的头,这通常是坏消息......但是如果你遍历list1,你将获得两个原始列表中的所有元素。 ..