这是面试中提出的问题。任何人都可以帮助我在java中实现它 给定2个链接列表(不需要具有唯一元素)以Y的形式找到交叉点。(它可以是任何地方 - 中间或尾部)
答案 0 :(得分:6)
如果列表的长度为O(N)
,则此解决方案为O(N)
,空格为O(1)
。
FUNCTION length(LIST list) : INT
// returns number of nodes until the end of the list
FUNCTION skip(LIST list, INT k) : LIST
// return the sublist of list, skipping k nodes
FUNCTION intersection(LIST list1, list2) : LIST
// returns the sublist where the two lists intersects
INT n1 = length(list1);
INT n2 = length(list2);
IF (n1 > n2) THEN
list1 = skip(list1, n1-n2)
ELSE
list2 = skip(list2, n2-n1)
WHILE (list1 != list2)
list1 = skip(list1, 1)
list2 = skip(list2, 1)
RETURN list1
基本上,遍历每个列表以查找有多少节点。然后,跳过较长列表中的足够元素,以便现在您具有相同长度的列表。然后,同步,一步一步前进,直到两个列表相遇。
答案 1 :(得分:2)
http://java.sun.com/docs/books/tutorial/collections/interfaces/set.html
目前我没有一个很好的例子,但我相信他指的是这个:
“两个集合的交集是仅包含两个集合共有的元素的集合。”
'sets'也可以是Lists等。
Java内置了这方法。
假设您有一个列表列表,您可以执行以下操作:
list.removeAll(列表2);
或
list.retainAll(列表2);
retainAll你会给你'十字路口',removeAll会给你两个列表之间的区别。
答案 2 :(得分:1)
根据@Lord Torgamus的问题,这是一个建议的 java 算法。
假设您有两个java Collection对象(和LinkedList,作为List的实现者,也是Collection的实现者)。要查找它们的交集,只需要在第一个对象上调用Collection#retainAll方法,将第二个对象作为参数。