返回
漫谈「02.07. 链表相交」:抽丝剥茧,交点初现
前端
2024-01-15 01:28:55
在算法面试中,链表相交是一个常见的考察点,考察的重点是如何有效地找到两个链表的交点。对于这项任务,我们提供了这篇文章,带你领略如何抽丝剥茧,找寻交点,掌握链表相交的奥秘。
在本文中,我们将从三个方面来探讨:
- 如何判断两个链表是否相交
- 如果相交,如何找到交点
- 代码实现和示例
一、判断链表是否相交
首先,我们需要确定两个链表是否相交。最简单的方法是使用两个指针,一个指向链表A的头部,另一个指向链表B的头部。然后,分别遍历两个链表,如果在遍历过程中遇到相同的节点,则说明两个链表相交。
二、找到链表相交的交点
如果两个链表相交,我们需要找到它们的交点。我们可以使用以下步骤来实现:
- 找到两个链表的长度。
- 将较长的链表向后移动,使其与较短的链表长度相同。
- 然后,从两个链表的头部同时向前移动,直到遇到相同的节点,这个节点就是交点。
三、代码实现和示例
def get_intersection_node(headA, headB):
"""
:type head1, head1: ListNode
:rtype: ListNode
"""
# 计算两个链表的长度
lenA = get_length(headA)
lenB = get_length(headB)
# 将较长的链表向后移动,使其与较短的链表长度相同
if lenA > lenB:
for i in range(lenA - lenB):
headA = headA.next
elif lenB > lenA:
for i in range(lenB - lenA):
headB = headB.next
# 从两个链表的头部同时向前移动,直到遇到相同的节点
while headA != headB:
headA = headA.next
headB = headB.next
# 返回交点
return headA
def get_length(head):
"""
:type head: ListNode
:rtype: int
"""
length = 0
while head:
length += 1
head = head.next
return length
示例:
# 创建两个链表
headA = ListNode(1)
headA.next = ListNode(2)
headA.next.next = ListNode(3)
headB = ListNode(4)
headB.next = ListNode(5)
headB.next.next = ListNode(6)
headB.next.next.next = headA.next.next
# 找到交点
intersection = get_intersection_node(headA, headB)
# 打印交点
print(intersection.val) # 输出:3
结语
链表相交是一个经典的算法面试题,通过理解链表相交的实质和掌握检测链表相交的技巧,可以帮助你在面试中脱颖而出。