两个列表的交点JAVA

时间:2018-09-29 13:42:54

标签: java algorithm linked-list

问题:给定两个可能或不相交的链表的头节点,找出它们是否相交并返回相交点;否则返回null。

求解时间:o(m + n),空间o(1)

  • 查找两个链接列表的长度:L1和L2
  • 计算两个链表的长度差:d = | L1-L2 |
  • 将较长列表“ d”的头指针向前移动
  • 现在遍历两个列表,比较节点,直到找到匹配项或 到达列表末尾

enter image description here

代码如下:

public static LinkedListNode intersect(
    LinkedListNode head1,
    LinkedListNode head2) {

    LinkedListNode list1node = null;
    int list1length = get_length(head1);
    LinkedListNode list2node = null;
    int list2length = get_length(head2);

    int length_difference = 0;
    if(list1length >= list2length) {
      length_difference = list1length - list2length;
      list1node = head1;
      list2node = head2;
    } else {
      length_difference = list2length - list1length;
      list1node = head2;
      list2node = head1;
    }

    while(length_difference > 0) {
      list1node = list1node.next;
      length_difference--;
    }

    while(list1node != null) {
      if(list1node == list2node) {
        return list1node;
      }

      list1node = list1node.next;
      list2node = list2node.next;
    }
    return null;
}

但是,我在想交叉点是否可能出现在较长列表中d步骤之前的位置?喜欢: enter image description here

我很困惑,请帮助我清除思路,谢谢!

4 个答案:

答案 0 :(得分:2)

一个节点只能有一个后继。在第二张图片中,相交节点有两个后继节点,这是不可能的。

答案 1 :(得分:0)

不。这是不可能的。因为在交点之后,两个列表的其余部分应该相同,这意味着它们应该具有

  1. 在该点之后的相同长度
  2. 此后的每个元素都相同。

因此d步骤之前是不可能的,因为那将不满足第1点的要求。

答案 2 :(得分:0)

您的算法正确。但是,在交点之后,它不再是两个列表,而是一个列表。

因此,d的任何区别都没有。的节点,它在交点之前

答案 3 :(得分:0)

首先,您不能使用给定的输入创建单链列表。  一个节点只能指向单个下一个节点。在您的输入中,节点指向两个下一个节点。您需要找到两个列表融合的交点。您的算法会在“ d”个节点之后立即找到相交点,这是预期的输出结果