我有两个整数的单链接列表。其中一个是另一个的子集(数字的顺序不同)。找到第一个列表包含而第二个列表不包含的数字的最佳方法(关于性能)是什么?
我的想法是首先对它们排序(使用合并排序),然后逐个元素进行比较。
因此,它需要O(nlogn+mlogm+n)
,但是应该存在更好的O(n)
解决方案。
最佳答案
这是时间和空间上的O(n)解决方案。
逻辑
假设原始链表的大小为N,我们将其称为LL1
,第二个链表称为LL2
。
=> 准备大小为N的Hasmap
,key
将是numbers
中的LL1
,而value
将是LL2
中的频率
HashMap<Integer,Integer> map= new HashMap<Integer,Integer>();
=> 开始遍历
LL1
并将所有数字的频率设置为0到LL1
中的所有值都被迭代时,您在HashMap
中出现的所有数字的频率均为0 map.put(key, 0);
=> 现在开始循环遍历
LL2
,使用数字作为键选择数字并按1
递增值。到LL2
中的所有值都被迭代时,您在LL1
中的LL1
和HashMap
中都存在所有通用数字frequency > 0
map.put(key, map.get(key) + 1);
=> 现在开始遍历
hasmap
,搜索value = 0
,找到后,打印key
,因为此数字仅出现在LL1
中,而不出现在LL2
中for (map.Entry<Integer,Integer> entry : map.entrySet())
{
if(entry.getValue() == 0)
System.out.println(entry.getKey());//This is a loner
}
2个迭代和O(n)内存,时间为O(n)。
关于java - 如何在O(n)的两个链接列表之间找到缺失的元素?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26091882/