Java Program to Find Intersection Point in Y Shaped Linked List in Java

2025年5月6日 | 阅读 9 分钟

Y 形链表是一种链表,其中两条不同的链表在一个共享的交点处相遇。在这个 Java 程序中,我们演示了如何确定两条链表汇合的交点。该方法包括遍历两条链表以验证它们是否有任何共同节点,并提供第一个共享节点作为交点。

使用暴力方法

确定两个链表交点的暴力方法包括将第一个链表的每个节点与第二个链表的每个节点进行比较。它检查每一对可能的节点,直到出现交点,或者在没有找到匹配项的情况下完全遍历两个链表。

算法

步骤 1:将 ptr1 设置为第一个链表的头,将 ptr2 设置为第二个链表的头。

步骤 2:逐个节点移动 ptr1,遍历第一个链表。

步骤 3:对于第一个链表中的每个节点,遍历第二个链表以比较节点。

步骤 4:如果 ptr1 和 ptr2 指向同一个节点,那就是交点。返回该节点。

步骤 5:如果检查完所有节点但未找到匹配项,则返回 null,表示没有交点。

实施

文件名:LinkedListIntersectionBruteForce.java

输出

 
Intersection point data: 4   

时间复杂度: O(N * M),其中 N 和 M 是两个链表的长度。这是因为对于第一个链表中的每个节点,我们都将其与第二个链表中的每个节点进行比较。

空间复杂度: O(1),因为除了指针之外,不使用任何额外的空间。

使用哈希方法

在这种方法中,我们遍历第一个链表并将所有节点存储在 HashSet 中。然后,我们遍历第二个链表,将每个节点与 HashSet 进行比较,以高效地找到交点。

算法

步骤 1:创建一个空的 HashSet 来存储第一个链表的节点。

步骤 2:将第一个链表的所有节点添加到 HashSet 中。

步骤 3:遍历第二个链表,检查是否有任何节点在 HashSet 中。

步骤 4:如果找到交点,则返回该节点;否则,继续检查。

步骤 5:如果没有找到交点,则返回 null。

实施

文件名:LinkedListIntersectionHashing.java

输出

 
Intersection point data: 4   

时间复杂度: O(N + M),其中 N 和 M 分别是第一个和第二个链表的长度。这是因为我们每个链表只遍历一次。

空间复杂度: O(N),其中 N 是第一个链表中的节点数。这是因为我们使用哈希集来存储来自第一个列表的节点。

使用并行遍历方法

在这种方法中,两个指针同时遍历两个链表。如果它们到达各自链表的末尾,则将它们重定向到另一个链表的头部,确保如果存在交点,它们将在交点处相遇。

算法

步骤 1:将两个指针 ptr1 和 ptr2 初始化为两个链表的头部。

步骤 2:遍历链表

  • 如果指针到达其链表的末尾,则将其重置为相反链表的头部。
  • 如果不是,则将指针移到下一个节点。

步骤 3:继续遍历,直到两个指针相遇。

步骤 4:返回它们相遇的节点作为交点,如果不存在交点则返回 null。

实施

文件名:LinkedListIntersectionParallelTraversal.java

输出

 
Intersection point data: 4   

时间复杂度: O(N + M)

空间复杂度: O(1)

循环链表方法

此方法利用形成循环链表的概念来检测两个链表中的交点。以下是说明

算法

步骤 1:遍历第一个链表以到达其最后一个节点。

步骤 2:暂时将第一个链表的最后一个节点连接到其头部,形成一个循环链表。

步骤 3:对第二个链表应用 Floyd 的循环检测算法

  • 使用两个指针(慢指针和快指针)来检测循环。
  • 如果没有检测到循环,则返回 null(不存在交点)。

步骤 4:如果存在循环,则识别循环开始的节点(交点)。

步骤 5:通过断开临时连接来恢复第一个链表。

实施

文件名:LinkedListIntersectionCircular.java

输出

 
Intersection point data: 4   

时间复杂度:O(N + M),其中 N 是第一个链表的长度,M 是第二个链表的长度。

辅助空间复杂度:O(1),因为只使用了常量级别的额外空间。


下一个主题字典序 Java