我的想法是首先对它们进行排序(使用归并排序),然后逐个比较元素。所以,它需要O(nlogn+mlogm+n)的时间,但应该存在一个更好的O(n)解决方案。
HashMap<Integer,Integer> map= new HashMap<Integer,Integer>();
=> 开始遍历 LL1
并将所有数字的频率设置为 0
当所有 LL1
中的值被迭代时,您就拥有了所有数字在 HashMap
中出现的频率为 0。
map.put(key, 0);
=> 现在开始循环遍历LL2
,使用它们作为键来选择数字,并将其值增加1
。
当所有LL2
中的值都被迭代时,您就拥有了HashMap
中同时存在于LL1
和LL2
中的所有公共数字,其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
}
使用O(n)时间和O(n)内存进行2次迭代。
HashSet是在这种情况下使用的最佳数据结构。 使用此代码,您可以在O(n)中实现结果。 如果您有更多条件,请告诉我,我可以相应地提供建议。
public class LinkedList {
private ListNode head;
public ListNode getHead() {
return head;
}
}
public class ListNode {
public int value;
public ListNode next;
ListNode(int value) {
this.value = value;
}
}
public class UtilClass{
public static int checkLists(LinkedList list1, LinkedList list){
ListNode head = myList2.getHead();
HashSet<Integer> hashSet = new HashSet<Integer>();
while(head!=null){
hashSet.add(head.value);
head = head.next;
}
head = myList.getHead();
while(head!=null){
boolean b = hashSet.add(head.value);
if(b == true) return head.value;
head = head.next;
}
return -1111;
}
}
你可以使用 removeAll 方法。你所需要做的就是创建一个接受两个列表的方法,一个是原始列表,另一个是子列表,然后返回一个缺失元素的列表:
List getMissing(List original, List sub){
original.removeAll(sub);
return original;
}
虽然这个运行时间为二次方,但如果你真的想要强制它在线性时间O(n)内运行,那么你必须编写自定义类来包装你的输入,以便对于每个输入,都有一个标志来监视是否已将其添加到子列表中。您还可以设计一个类,它可以在监视两个列表内容的同时促进元素的添加和删除。
令N = m+n。
所以 O(N . log N)。
由于列表未排序,任何加速都包括类似排序的操作,而这会增加成本。因此 O(N.log N) 是可以接受的。
如果您想要 O(N),可以按以下方式执行(简化,使用正数):
BitSet present = new BitSet(Integer.MAX_VALUE);
for (int value : sublist)
present.set(value);
for (int value : list)
if (!present.isSet(value)) {
System.out.println("Missing: " + value);
break;
}
这是在内存与时间之间做出的权衡。需要注意的是,这个答案可能不被接受,因为内存大小是2MAX_VALUE,初始化/清除所需的时间也很长。
可能的O(N log N)解决方案
最聪明的答案可能是协作排序两个列表,并在排序过程中检测缺失的元素。类似于随意选择一个“中位数”元素并移动索引以分割列表,并采取分治的方法。
如果列表大小相差1
那么你只需要对每个列表进行求和,差值就是缺失的值:O(N)。可以处理溢出。
Set
。 - GeneLinkedHashSet
。http://docs.oracle.com/javase/6/docs/api/java/util/LinkedHashSet.html - Gene