题目 :
给出两个链表的头指针,比如h1,h2,判断这两个链表是否相交。
扩展:
(1) 如果链表可能有环呢?
(2) 如何求出两个相交链表的相交的第一个节点。
如果链表没有环
假设两个链表没有环,如果它们相交,那么它们的最后一个元素必定相同。
public boolean isConNLoop(ListNode h1, ListNode h2) { if (h1 == null || h2 == null) return false; ListNode n1 = h1; ListNode n2 = h2; while (n1.next != null) n1 = n1.next; while (n2.next != null) n2 = n2.next; if (n1 == n2) return true; return false; }
它们的交点为
public ListNode findPointNLoop(ListNode h1, ListNode h2) { if (h1 == null || h2 == null) return null; ListNode n1 = h1; ListNode n2 = h2; int len1 = 0; int len2 = 0; while (n1 != null) { n1 = n1.next; len1++; } while (n2 != null) { n2 = n2.next; len2++; } n1 = h1; n2 = h2; if (len1 < len2) { n1 = h2; n2 = h1; } for (int i = len1-len2; i > 0; i--) n1 = n1.next; while (n1 != null && n1 != n2) { n1 = n1.next; n2 = n2.next; } return n1; }
如果链表有环
如果链表有环且相交,那么这两个链表都是有环的。
找到第一个链表的环点,然后将环断开(当然不要忘记了保存它的下一个节点),然后再来遍历第二个链表,如果发现第二个链表从有环变成了无环,那么他们就是相交的嘛,否则就是不相交的了。
public boolean isConLoop(ListNode h1, ListNode h2) { ListNode temp = loopEntry(h1); ListNode org = temp.next; temp.next = null; if (isLoop(h2)) { temp.next = org; return false; } else { temp.next = org; return true; } } public ListNode loopEntry(ListNode head) { if (head == null) return null; ListNode slow = head; ListNode fast = slow.next; while (fast != null && fast.next != null && fast != slow) { slow = slow.next; fast = fast.next.next; } if (fast == slow) { fast = head; slow = slow.next; while (fast != slow) { slow = slow.next; fast = fast.next; } return slow; } return null; }
寻找环点的方法如下:
两个指针,一个走一步,一个走两步,在环中相遇位置为X。然后从头节点和X位置,分别一步一步的走,每次判断是否相遇,相遇点就是所求节点。
证明如下:假设头节点位置为A,环点为M,相遇节点为X,环长为Len。
因为快节点每次比慢节点快一步,慢节点进入环后快节点不用一圈就能赶上慢节点了。
慢节点走的路程 = AM + MX
快节点走的路程 = AM + MX + n * Len
=> 2*(AM + MX ) = AM + MX + n *Len
=> AM + MX = n*Len
=> AM = (n-1)*Len + XM,说明从A到M的距离与X到M的距离,模环长同余。因此分别从A和X走,必然相交于M节点。
当两个有环的链表相交时,有以下两种情况:
在这种情况下,两个链表的交点在环点之前,可以将环点切断,这样就变成了两个无环的链表求相交点。可使用以上方法。
另一种情况为:
在这种情况下,不存在所谓的相交点。
相关推荐
### 编程判断两个链表是否相交 在计算机科学中,链表是一种常见的数据结构,广泛应用于多种算法实现和实际应用中。本篇文章将详细探讨如何判断两个单向链表是否相交的问题,以及相应的解决方案。 #### 问题背景 在...
分析与解法 这样的一个问题,也许我们平时很少考虑。但在一个大的系统中,如果出现两个链表相 交的情况,而且释放了其中一个链表的...的两个链表,我们希望在释放一个链表之前知道是否有其他链表跟当前这个链表相交。
1.3.9 如何判断两个链表是否相交
本篇文章讨论了四种判断两个单链表是否相交的算法,这些算法主要应用于解决《编程之美》中的相关问题。 **解法一**是最直观的方法,称为“两两遍历法”。它通过分别遍历两个链表h1和h2,寻找h1中的节点是否出现在h2...
在本文中,我们将深入探讨如何使用C++将二叉树转换为双向链表,并讨论如何判断两个链表是否相交,以及找到它们相交的第一个节点。首先,让我们详细了解一下二叉树和双向链表的基本概念。 二叉树是一种数据结构,...
判断两个有环链表是否相交,相交则返回第一个相交节点,否则返回null 在考虑此问题时,根据前面几篇文章的解法,我们已经得到了各自链表的入环节点,分别为loop1和loop2 思路 以下是问题三的具体解决过程: 如果loop...
本篇文档主要总结了链表相关的两种常见问题:单链表的反转和判断两个链表是否相交。 首先,我们来看单链表的反转问题。在链表反转的过程中,我们需要将链表的顺序颠倒,使原本的尾节点变为新的头节点,而原头节点...
这道题目要求判断两个链表是否相交。解决这个问题需要使用双指针算法,先让两个指针从两个链表的头节点开始移动,然后找到相交的节点。 8. 其他题目 这道题目包括了一些奇怪的题目,旨在考察面试者的思维能力。...
7. 判断两个链表是否相交 本题目要求给出两个单向链表的头指针,判断这两个链表是否相交。解决这个问题的关键是正确地设计算法,以 O(n) 的时间复杂度解决问题。 8. 算法题 本题目要求解决一些比较怪的题目,考验...
判断两个链表是否相交,首先遍历两个链表,计算它们的长度并找出长度差。然后将长链表指针向前移动长度差的步数,最后同时遍历两个链表,如果它们指向同一节点,则链表相交,否则不相交。 问题扩展: 1. 判断二元树...
- 判断两个链表是否相交:分别遍历两个链表,记录它们的长度,然后从较长链表的头开始,向短链表方向移动长度差,若相遇则相交,同时计算交点。 - 删除重复元素:遍历链表,比较当前节点与下一个节点,如果相同,...
在这道题中,我们需要判断两个链表是否相交。为了实现这一目标,我们需要对链表进行遍历,并使用合适的算法来判断是否相交。 知识点八: 思维题 在这道题中,我们需要使用思维来解决一些怪的题目,例如判断三盏灯的...
4. **判断两个链表是否相交**:使用两个指针分别从两个链表的头节点开始遍历,若相遇则说明链表相交,相交节点即为相遇点。如果一个链表遍历完后另一个仍在继续,说明不相交。 5. **二叉树中两个节点的最小距离**:...
7. **判断两个链表是否相交** - 判断两个单链表是否有交点,可以使用双指针法。让一个指针从第一个链表的头节点开始,另一个从第二个链表的头节点开始,同时移动。如果链表相交,最终两个指针会相遇;如果不相交,...
链表相关问题的完整代码,包括测试类和关键代码: **0、将链表翻转** **1、判断链表是否有环** **2、寻找环的入口点** **3、计算环的节点数** ...**6、判断两个无环链表是否相交** **7、寻找两个链表的相交的节点**
- **判断两个链表是否相交**:计算两个链表的长度,让长度长的链表先走差值步数,然后两个指针同时移动,若相遇则相交。 - **找到相交点**:同上,两个指针同时移动,相遇点即为相交点。 - **链表模拟大整数加法**:...
7. **判断两个链表是否相交**: 直接法是遍历两个链表直到相遇或遍历完。如果一个链表遍历完另一个未完,说明不相交。如果都遍历完且相遇,则相交。扩展问题中如果链表有环,需要使用Floyd判断环算法或双指针法判断...
单链表的特殊问题还包括链表是否有环以及如何找到环的起点和环的长度,判断两个链表是否相交以及求解交点。这些题目考察了应聘者处理复杂数据结构时的逻辑思维能力和编程技巧。 此外,文件中还提到了用链表模拟大...