数据结构与算法之 leetcode 链表相交算法 双指针遍历法

数据结构与算法阿木 发布于 2025-07-12 6 次阅读


链表相交算法(双指针遍历法)详解与实现

在数据结构与算法的学习过程中,链表是一种常见的线性数据结构。链表由一系列节点组成,每个节点包含数据和指向下一个节点的指针。在某些场景下,两个链表可能会相交,即它们的某些节点是相同的。在LeetCode等编程竞赛平台中,链表相交问题是一个经典的算法题目。本文将围绕链表相交算法(双指针遍历法)进行详细讲解,并提供相应的代码实现。

链表相交问题概述

链表相交问题可以描述为:给定两个单链表,请编写一个程序找到它们的第一个公共节点。如果两个链表没有公共节点,则返回null。

双指针遍历法原理

双指针遍历法是解决链表相交问题的常用方法。其基本思想是使用两个指针分别遍历两个链表,当其中一个指针到达链表尾部时,将其指向另一个链表的头部,继续遍历。这样,当两个指针相遇时,它们必然指向相交的节点,或者都指向null(表示没有相交节点)。

代码实现

以下是一个使用双指针遍历法解决链表相交问题的Python代码实现:

python

class ListNode:


def __init__(self, val=0, next=None):


self.val = val


self.next = next

def getIntersectionNode(headA, headB):


if not headA or not headB:


return None

pA, pB = headA, headB


while pA != pB:


pA = pA.next if pA else headB


pB = pB.next if pB else headA

return pA

测试代码


def create_list(nums):


if not nums:


return None


head = ListNode(nums[0])


current = head


for num in nums[1:]:


current.next = ListNode(num)


current = current.next


return head

def print_list(head):


current = head


while current:


print(current.val, end=' ')


current = current.next


print()

创建两个相交的链表


list1 = create_list([1, 2, 3, 4, 5])


list2 = create_list([0, 1])


list2.next.next.next.next.next = list1.next.next.next

找到相交节点


intersection_node = getIntersectionNode(list1, list2)


if intersection_node:


print("相交节点的值为:", intersection_node.val)


else:


print("两个链表没有相交节点")


代码分析

1. `ListNode` 类定义了链表节点的结构,包含值 `val` 和指向下一个节点的指针 `next`。

2. `getIntersectionNode` 函数接收两个链表的头节点 `headA` 和 `headB`,并返回它们的第一个公共节点。

3. 在 `getIntersectionNode` 函数中,我们定义了两个指针 `pA` 和 `pB` 分别遍历两个链表。当 `pA` 或 `pB` 到达链表尾部时,将其指向另一个链表的头部,继续遍历。

4. 当 `pA` 和 `pB` 相遇时,它们必然指向相交的节点,或者都指向 `None`(表示没有相交节点)。

5. 测试代码部分创建了两个相交的链表,并调用 `getIntersectionNode` 函数找到相交节点。

总结

本文详细讲解了链表相交算法(双指针遍历法)的原理和实现。通过双指针遍历法,我们可以高效地找到两个链表的第一个公共节点。在实际应用中,链表相交问题在计算机网络、数据库等领域有着广泛的应用。希望本文能帮助读者更好地理解和掌握链表相交算法。