1 问题描述
判断两个链表是否存在交叉,若存在,返回开始交叉的节点,否则返回null。
2 算法实现
显然这一题可以用哈希表实现,而且实现方法比较简单,因此省略不言。
考虑使用双指针法实现,其原理在于,使用两个链表分别从链表 A A A,链表 B B B开始遍历两个链表,当其中一个指针遍历到某个链表的尾部时,令其指向另一个链表的头部,这样,两个指针会从不同的头部把两个链表都遍历一遍,由于两个链表的交叉部分长度是相同的,因此两个指针一定会在某一时刻指向同一个位置(否则会同时指向None)。这个同时指向的位置就是两个指针指向地址相等的值,返回这个值即可。
python代码实现:
# 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:
if (headA is None) or (headB is None):
return None
elif headA == headB:
return headA
else:
sigA = headA
sigB = headB
while sigA != sigB:
sigA = sigA.next
sigB = sigB.next
if (sigA is None) and (sigB is not None):
sigA = headB
elif (sigA is not None) and (sigB is None):
sigB = headA
if sigA == sigB:
return sigA
时间复杂度显然为 O ( m + n ) O(m+n) O(m+n),空间复杂度为 O ( 1 ) O(1) O(1)。
很巧妙的方法,要学会链表的多指针索引,循环链表判断时使用快慢指针,交叉链表使用两个指针从不同头部遍历两个链表,思路很值得借鉴。