Java 合并有序列表
请允许我举个例子问这个问题: 假设我们有以下3个列表(为了清楚起见,省略了双引号): 输出列表可以如下所示(还有更多解决方案) 总之,生成的有序集Java 合并有序列表,java,Java,请允许我举个例子问这个问题: 假设我们有以下3个列表(为了清楚起见,省略了双引号): 输出列表可以如下所示(还有更多解决方案) 总之,生成的有序集 包含所有列表中元素的并集 保留所有原始列表中元素的顺序 第四个列表L4:(b,c,d)当添加到输入时,应该抛出一个异常(因为在L1中c位于b之前) 我通过检查得出了答案。有人能提出一个算法来做这件事吗? 谢谢,-M.S.这可以使用 首先从列表中构建有向图。列表中的元素将成为节点。边从第一个元素到第二个元素,从第二个元素到第三个元素,依此类推 根据
- 包含所有列表中元素的并集
- 保留所有原始列表中元素的顺序
digraph {
{
edge [color = "red"]
a -> c
c -> b
b -> d
d -> f
f -> j
}
{
edge [color = "blue"]
b -> e
e -> j
j -> k
}
{
edge [color = "green"]
a -> d
d -> e
e -> g
g -> h
h -> j
j -> i
}
}
这是一个尝试。通常的免责声明适用 主逻辑 本质上,这是一个两步的过程 1.将3个列表转换为一个双链接列表,每个节点都指向下一个元素,并使用第二个指针指向任何同级(如e/f或i/k)。转换后,它应该看起来像
a->c->b->d->f->g->h->j->k
| |
e i
2.编写一个函数,该函数包含两个元素和上面的链表,并返回一个标志,指示第一个元素是出现在第二个元素之前、之后还是与第二个元素位于同一位置。该方法的一个可能特征可能是
int getRelativePositionOf(char e1, char e2)
//returns -1 if e1 exists before e2, 0 if e1 and e2 are siblings and 1 if e1 exists after e2.
这将帮助您验证第四个列表,并在任意两个元素的相对位置与原始数据不同时引发异常
创建链接列表
可以想象,第一步,即创建双链接列表是最具挑战性的部分。我还没有想出最优雅的方法来创造它,但这里有一个
显然,步骤5是上述算法中最丑陋、最棘手的部分。但我认为可以对其进行优化,使其更简单、更快。例如,您可以从原始列表中创建char->position的hashmaps,以便在确定相对位置时更快地查找。此外,您还可以维护一组已存在于链表中的所有元素,以避免在该元素已存在时遍历链表。我相信有很多方法可以进一步优化它。我不是专家,但看起来这可以通过基于图形的数据结构来实现。你说的是合并有序列表-在我看来,它们没有顺序。有什么想法吗,Rahul?我在考虑深度优先树搜索,但这可能不太好。可能是O(n3)Romain,前3个列表都是按字母顺序排列的,不是按字母顺序排列的,而是按其他一些标准排列的。
a->c->b->d->f->g->h->j->k
| |
e i
int getRelativePositionOf(char e1, char e2)
//returns -1 if e1 exists before e2, 0 if e1 and e2 are siblings and 1 if e1 exists after e2.
a->d->e->g->h->j->i