联系人面试问题

时间:2010-05-05 14:38:15

标签: java linked-list

这是面试中提出的问题。任何人都可以帮助我在java中实现它 给定2个链接列表(不需要具有唯一元素)以Y的形式找到交叉点。(它可以是任何地方 - 中间或尾部)

3 个答案:

答案 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方法,将第二个对象作为参数。