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

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


摘要:

链表相交节点问题在LeetCode中是一道经典的算法题,主要考察对链表数据结构和双指针遍历技术的掌握。本文将围绕这一主题,详细解析链表相交节点的求解方法,并通过代码实现来展示如何运用双指针遍历策略解决此问题。

一、问题背景

链表相交节点问题指的是在两个单链表中,存在一个公共的节点,即从该节点开始,两个链表的后续节点完全相同。我们的目标是找到这个公共节点。

二、问题分析

要解决这个问题,我们可以采用以下思路:

1. 首先确定两个链表的长度。

2. 然后让较长的链表先走(长度差值)步,这样两个链表的头部节点就对齐。

3. 接下来,同时遍历两个链表,当两个指针相遇时,即为相交节点。

三、双指针遍历策略

双指针遍历是一种常用的算法技巧,它利用两个指针分别遍历两个数据结构,从而实现一些特定的功能。在链表相交节点问题中,我们可以使用两个指针分别遍历两个链表,直到它们相遇。

四、代码实现

以下是用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

获取两个链表的长度


lenA, lenB = 0, 0


pA, pB = headA, headB


while pA:


lenA += 1


pA = pA.next


while pB:


lenB += 1


pB = pB.next

让较长的链表先走长度差值步


if lenA > lenB:


pA, pB = headA, headB


for _ in range(lenA - lenB):


pA = pA.next


else:


pA, pB = headB, headA


for _ in range(lenB - lenA):


pB = pB.next

同时遍历两个链表,直到相遇


while pA and pB:


if pA == pB:


return pA


pA = pA.next


pB = pB.next

return None

测试代码


def create_list(nums):


head = ListNode(0)


p = head


for num in nums:


p.next = ListNode(num)


p = p.next


return head

def print_list(head):


p = head


while p:


print(p.val, end=' ')


p = p.next


print()

创建两个相交的链表


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


list2 = create_list([0, 6, 7])


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

找到相交节点


intersection_node = getIntersectionNode(list1, list2)


if intersection_node:


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


else:


print("两个链表不相交。")


五、总结

本文通过分析链表相交节点问题,介绍了双指针遍历策略,并给出了相应的代码实现。在实际应用中,我们可以根据具体问题选择合适的算法和数据结构,以提高代码的效率和可读性。