代码随想录算法训练营第四天(3)|面试题 02.07. 链表相交

41 阅读2分钟

题目描述

给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。

代码示例

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode:
        # 计算链表长度
        def get_length(node):
            length = 0
            while node:
                node = node.next
                length += 1
            return length

        lenA, lenB = get_length(headA), get_length(headB)
        curA, curB = headA, headB

        # 让较长的链表先走到与较短链表相同长度的位置
        if lenB > lenA:
            curA, curB = headB, headA

        gap = abs(lenA - lenB)
        for _ in range(gap): 
	        curA = curA.next

        # 同时遍历两个链表,找到交点
        while curA and curB:
            if curA == curB:
                return curA
            else:
                curA = curA.next
                curB = curB.next

        return None

# 示例
# 假设有两个链表 A 和 B,它们相交于节点 C
# 创建链表节点
nodeA1 = ListNode(1)
nodeA2 = ListNode(2)
nodeB1 = ListNode(3)
nodeB2 = ListNode(4)
nodeC1 = ListNode(5)
nodeC2 = ListNode(6)

# 构建链表 A: 1 -> 2 -> 5 -> 6
nodeA1.next = nodeA2
nodeA2.next = nodeC1

# 构建链表 B: 3 -> 4 -> 5 -> 6
nodeB1.next = nodeB2
nodeB2.next = nodeC1

# 创建 Solution 对象
solution = Solution()

# 获取相交节点
result = solution.getIntersectionNode(nodeA1, nodeB1)

# 输出相交节点的值
print(result.val if result else "No intersection")

在面对两个单链表相交的问题时,我最初的想法是需要通过指针相等来找出相交的节点。然而,这引发了一个新的问题:如何同时遍历两个链表呢?

通过阅读代码随想录后,我获得了一种更为清晰的思路。首先,我计算了两个链表的长度,并找出了最长的链表。接下来,我计算了两个链表的长度差值,记为 n。为了让最长的链表先走 n 步,我将其指针移动到与较短链表相同长度的位置。最后,我同时遍历两个链表,并对比节点是否一致。如果一致,那么找到了相交的起始节点;如果不一致,则返回 None。

这种方法的关键在于通过计算长度差值,使得两个链表在遍历时能够同时到达相交的起始节点。这样的思路更加清晰,让我能够更有信心解决这类问题。通过不断学习和实践,我对链表问题的处理能力有了进一步的提升。