链表相交算法(双指针遍历法)详解与实现
在数据结构与算法的学习过程中,链表是一种常见的线性数据结构。链表由一系列节点组成,每个节点包含数据和指向下一个节点的指针。在某些场景下,两个链表可能会相交,即它们的某些节点是相同的。在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` 函数找到相交节点。
总结
本文详细讲解了链表相交算法(双指针遍历法)的原理和实现。通过双指针遍历法,我们可以高效地找到两个链表的第一个公共节点。在实际应用中,链表相交问题在计算机网络、数据库等领域有着广泛的应用。希望本文能帮助读者更好地理解和掌握链表相交算法。
Comments NOTHING