📅  最后修改于: 2023-12-03 15:40:54.231000             🧑  作者: Mango
在日常的开发工作中,我们常常需要处理链表相关的问题。其中,查找两个链表的交点是一道常见的算法题,在面试中也很有可能会遇到。本文将介绍如何用 C# 编写一个查找两个链表的交点的程序,并对程序中的关键代码进行说明。
假设有两个单向链表,现在需要编写一个函数来查找它们的交点。如果没有交点,则返回 Null。
示例:
链表 A:1 → 2 → 3 链表 B:2 → 3 交点:2 → 3
要查找两个链表的交点,我们可以使用双指针的方法。假设链表 A 的长度为 a,链表 B 的长度为 b,它们的交点位置离链表 A 的头节点的距离为 c1,离链表 B 的头节点的距离为 c2,则有以下关系式:
下面是用 C# 实现查找两个链表的交点的代码。我们先定义了一个 ListNode 类来表示链表结点,然后编写了一个名为 GetIntersectionNode 的函数来查找交点。
public class ListNode {
public int val;
public ListNode next;
public ListNode(int x) { val = x; next = null; }
}
public class Solution {
public ListNode GetIntersectionNode(ListNode headA, ListNode headB) {
if (headA == null || headB == null) {
return null;
}
ListNode pA = headA;
ListNode pB = headB;
while (pA != pB) {
pA = pA == null ? headB : pA.next;
pB = pB == null ? headA : pB.next;
}
return pA;
}
}
以上代码中,我们使用了两个指针 pA 和 pB 来遍历链表。如果两个链表有相交的部分,则在该部分之后,它们的长度相同。在第一次遍历时,pA 和 pB 将到达相交部分的位置,从而找到交点。如下所示:
while (pA != pB) {
pA = pA == null ? headB : pA.next; // pA 到达尾部后指向 headB,继续前进
pB = pB == null ? headA : pB.next; // pB 到达尾部后指向 headA,继续前进
}
如果两个链表没有交点,则在第一次遍历后,pA 和 pB 将同时到达链表的尾部,此时返回 null。
本文介绍了如何用 C# 编写一个查找两个链表的交点的程序,并对程序中关键代码进行了详细的说明。这是一个常见的算法题,掌握它有助于我们提高编程能力,同时在面试中也很有可能会遇到。