此题初看不会,没想到能用双指针的写法。
题目如下:
解法有三种,第一种暴力法:
- 遍历A的每一个节点,和B的所有节点一一比较
第二种哈希表
- 遍历一遍A,把A的节点的地址留在哈希表中
- 遍历B,对比B的节点是否在哈希表中。
第三种, 双指针法
- p指向A的头节点,q指向B的头结点
- p遍历到A的尾结点,保存A的尾结点的数值Ava,然后让p指向B的头节点
- q遍历到B的尾结点之后,保存B的尾结点的数值Bval,然后指向A的头节点
- 若q和p相等,返回
- 若Aval != Bval,则没有交点
双指针法之所以有效,是因为
a
+
a
l
l
+
b
=
b
+
a
l
l
+
a
a + all + b = b + all + a
a+all+b=b+all+a
a指的是在A中不重叠的那一部分,b指的是在B中不重叠的那一部分, all指的是重叠的那一部分。
第三种解法代码如下:
class Solution(object):
def getIntersectionNode(self, headA, headB):
"""
:type head1, head1: ListNode
:rtype: ListNode
"""
p = headA
q = headB
last_A = None
last_B = None
if not headA or not headB:
return None
while p != q:
if p.next:
p = p.next
else:
last_A = p.val
p = headB
if q.next:
q = q.next
else:
last_B = q.val
q = headA
if last_A != None and last_B !=None:
if last_A != last_B:
return None
return p