📜  用于查找两个链表的交点的 C# 程序(1)

📅  最后修改于: 2023-12-03 15:40:54.231000             🧑  作者: Mango

查找两个链表的交点的 C# 程序介绍

在日常的开发工作中,我们常常需要处理链表相关的问题。其中,查找两个链表的交点是一道常见的算法题,在面试中也很有可能会遇到。本文将介绍如何用 C# 编写一个查找两个链表的交点的程序,并对程序中的关键代码进行说明。

题目描述

假设有两个单向链表,现在需要编写一个函数来查找它们的交点。如果没有交点,则返回 Null。

示例:

链表 A:1 → 2 → 3 链表 B:2 → 3 交点:2 → 3

思路分析

要查找两个链表的交点,我们可以使用双指针的方法。假设链表 A 的长度为 a,链表 B 的长度为 b,它们的交点位置离链表 A 的头节点的距离为 c1,离链表 B 的头节点的距离为 c2,则有以下关系式:

  • pA 指针先走 c1 步,然后与 pB 指针同时向前走。
  • 如果有交点,则 pA 和 pB 指针会在交点相遇,返回交点。
  • 如果没有交点,则 pA 和 pB 指针都会走到链表的尾部,返回 Null。
代码实现

下面是用 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# 编写一个查找两个链表的交点的程序,并对程序中关键代码进行了详细的说明。这是一个常见的算法题,掌握它有助于我们提高编程能力,同时在面试中也很有可能会遇到。