【问题标题】:Intersection Point of Two Lists JAVA两个列表JAVA的交点
【发布时间】:2018-09-29 13:42:54
【问题描述】:

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

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

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

代码如下:

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 步之前的位置?像:

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

【问题讨论】:

    标签: java algorithm linked-list


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      因此在d 步骤之前是不可能的,因为这不满足第 1 点。

      【讨论】:

        【解决方案3】:

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

        所以无论d 你有什么不同。的节点,它是之前交点。

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            猜你喜欢
            • 2015-10-19
            • 2016-11-28
            • 2020-05-31
            • 1970-01-01
            • 1970-01-01
            • 2012-02-12
            • 1970-01-01
            • 1970-01-01
            • 2014-06-12
            相关资源
            最近更新 更多