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