我有2个列表,一个列表l1包含n1个元素,另一个列表l2包含n2个元素。两个列表长度不同并且包含重复元素。我想创建另一个列表,其中包含l1和l2中的唯一元素。我怎样才能有效地做到这一点以及该解决方案的性能是什么?
P.S:我想要一个不使用任何其他数据结构的解决方案。
答案 0 :(得分:3)
如果您不能使用Set,我认为最好的解决方案是进行合并排序而不重复。这个问题可能有所帮助:How do I use merge sort to delete duplicates?
答案 1 :(得分:0)
创建一个新的Set并从列表l1和l2添加元素。最终的集合将是不包含重复的集合。但请确保您已正确实现了equals()和hashCode()。
以下是我的样本(不完美)。在此发布它以验证我的逻辑;-)或者看看是否有更好的方法来优化这个
Lit unique=...
if(l1.size==l2.size())
{
//o(n)
copyToUnique(l1, l2, unique)
}
else if(l1.size>l2.size())
{
//o(n) + num of extra elements
copyToUnique(l1, l2, unique)
unique.addAll(l1.subList(l2.size(),l1.size());
}
else if(l1.size<l2.size())
{
//o(n) + num of extra elements
copyToUnique(l2, l1, unique)
unique.addAll(l2.subList(l1.size(),l2.size());
}
public void copyToUnique(List l1, List l2, List unique)
{
for(Object element:l1)
{
if(!l2.contains(element))
{
unique.add(element);
}
}
unique.addAll(l2);
}
答案 2 :(得分:0)
如果你只需要使用列表,并且你有可能在每个列表和列表中重复,那么你需要创建一个新的列表,l3(以保持l1和l2元素的并集)并迭代每个列表,如果对l3.contains(e)的调用返回false,则插入每个元素e项。
正如其他人所提到的,使用Set绝对是删除列表重复项的最简单方法,可以从Set创建List以返回给调用者。
性能是线性的,并且基于l1 + l2中的元素数量。
答案 3 :(得分:0)
O(nlogn)的解决方案是对每个列表进行排序,然后一起浏览两个列表,找到重复项。您可以增加一个列表或另一个列表(或两者)的位置,具体取决于哪个列表具有当前元素的“最小”值(或者它们是否相同)。有一个合理的开销,所以一些O(n ^ 2)算法实际上可能会更快,具体取决于数据的大小/分布。