Java 访谈:从两个链表中找到相似的元素,并将结果作为链表返回

Java 访谈:从两个链表中找到相似的元素,并将结果作为链表返回,java,algorithm,Java,Algorithm,这个问题是在采访我朋友时问的。面试官要求找到算法并用Java编写代码 问题:从两个链表中查找相似的元素,并将结果作为链表返回 例如:如果linkedlist1有1->2->3->4->4->5->6,linkedlist2有1->3->6->4->2->8 结果链接列表1->2->3->4->6 谢谢创建一个哈希表。 浏览第一个链接列表,在访问时标记条目。O(N) 浏览第二个链接列表,在访问时标记条目(不同的标志等)。O(M) 遍历哈希表并查找包含两个LL成员的所有条目。查找条目时创建新的LL成

这个问题是在采访我朋友时问的。面试官要求找到算法并用Java编写代码

问题:从两个链表中查找相似的元素,并将结果作为链表返回

例如:如果linkedlist1有1->2->3->4->4->5->6,linkedlist2有1->3->6->4->2->8

结果链接列表1->2->3->4->6

谢谢创建一个哈希表。
浏览第一个链接列表,在访问时标记条目。O(N) 浏览第二个链接列表,在访问时标记条目(不同的标志等)。O(M)

遍历哈希表并查找包含两个LL成员的所有条目。查找条目时创建新的LL成员。O(H)

总复杂度:O(N)+O(M)+O(Max(N,H,M))=>O(N)

注:编辑Saurabh的答案

那么:

return new LinkedList(new LinkedHashSet(list1).retainAll(list2));

这将保留列表1中的顺序。当然,有人可能会抱怨这是作弊,如果提问者的意思是你应该自己构建算法,但如果唯一的限制是“用Java编写”,那么这是一个有效的解决方案(而且很可能比任何人手工制作的低级解决方案更有效、更没有bug).

获取第一个链表并从第一个元素开始,将其与第二个链表的第一个元素进行比较,如果它们相同,则将值添加到结果并转到第一个列表的第二个元素,否则转到第二个列表的第二个元素,执行此操作,直到值相同或到达第二个列表的和。

使用HashSet for constant time contains操作

迭代第一个列表并将它们添加到哈希集中--O(n) (注意,添加到HashSet是一个常数时间)

迭代第二个列表,如果hashSet.contains包含,则将它们添加到结果列表中


在循环结束时,返回结果列表

@zengr Nope MSFT:),无论如何,两家公司在面试问题上都排在同一行;)@codaddict他们可以按任何顺序排列,可能不会被排序可能重复的@Joonas Well面试官要求的算法,然后编码:)。但是你的解决方案很方便:)如果问题是,如上所述,“问题:从两个链表中找到相似的元素,并将结果作为链表返回”,那么他没有特别要求算法。@Joonas我现在更改了描述,这是不可接受的。问题明确要求一个算法“被要求查找算法和代码”。o(n^2)解。非常昂贵。为什么复杂性是O(N),你能解释一下吗?@Saurabh,第一次遍历需要
O(N)
时间,第二次遍历需要
O(m)
时间,第三次遍历需要
O(N+m)
时间。假设
n=m
,整个算法在列表的大小上是线性的。您所需要的不是哈希表,而是哈希集。