algorithm - 存储 2 个链表的数组中的压缩

标签 algorithm data-structures linked-list complexity-theory

数组 Arr(大小为 n)可以表示双向链表。 [假设细胞有 struct { int val, next, prev; } ]

我在数组中存储了两个列表 A 和 B。 A 有 m 个节点,B 有 n - m 个节点。

这些节点是分散的,我想重新排列它们,使 A 的所有节点都来自 Arr[0] .. Arr[m-1] 和其余节点由 B 的节点填充,时间为 O(m)。

我想到的解决方案是:

  • 迭代A直到出现一个位于Arr[m-1]之外的节点
  • 然后,迭代B直到出现一个位于Arr[m]之前的节点
  • 交换两者(包括操纵它们及其邻居的 next prev 链接)。

但是在这种情况下,迭代的总数是 O(n + m)。因此应该有更好的答案。

附言: 这个问题出现在Introduction to Algorithms, 2nd edition . 习题10.3-5

最佳答案

如何遍历列表 A 并将每个元素放入 Arr[0] ... Arr[m-1] 中,显然将其位置与那里的任何元素交换之前并更新上一个/下一个链接。会有很多交换,但仍然是 O(m),因为一旦你完成 A 的迭代(m 次迭代),所有它的元素的一部分将位于(按顺序,顺便说一下)Arr 的前 m 个槽中,因此 B 必须完全位于Arr 的其余部分。

添加一些伪代码

a := index of head of A 
for i in 0 ... m-1
    swap Arr[i], Arr[a]
    a := index of next element in A
end

关于algorithm - 存储 2 个链表的数组中的压缩,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6937430/

相关文章:

c++ - 用C++转置矩阵最快的方法是什么?

algorithm - Javascript 数据结构库

ruby-on-rails - 处理标记为 "final"的数据与可能发生更改的数据的最高效代码方式

data-structures - Ada- 'at' 和 'range' 是什么意思/做什么?

algorithm - 了解减法算法

c++ - 是否有任何交互式控制台 B-Tree 实现?

c - 使用链表的 C 中的哈希表

c++ - 链表指针赋值为什么我们不能直接将tail赋值给temp而不是tail->tail next

c - 如何将一个结构指向另一个

arrays - Kadane 的打印最大子数组元素的算法?