有两种解决方法:
第一种:利用哈希集合不重复的特性,代码展示如下
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
Set<ListNode> listNode = new HashSet<ListNode>();
ListNode p = headA;
while(p != null) {
listNode.add(p);
p = p.next;
}
p = headB;
while(p != null) {
if (listNode.contains(p)) {
return p;
}
p = p.next;
}
return null;
}
}
第二种:双指针,看过题解才想到,题解有给出为什么可以用双指针的证明过程,如下
然后我说一下我的想法,当然和官方的证明思想是一样的,就是我们学的平均速度,把这两条链表当作是两条公路,如下图所示,如果速度一样,则必定在路程相同的点相遇(即相交点),pA走的是a->c->d->b,pB走的b->c->e->a (e和d是画的虚线,便于理解,不计算路程,可当作链表指针),很明显a+c+b = b+c+a
代码如下
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
if (headA == null || headB == null) {
return null;
}
ListNode p = headA, q = headB;
while(p != q) {
if (p != null) {
p = p.next;
} else {
p = headB;
}
if (q != null) {
q = q.next;
} else {
q = headA;
}
}
return p;
}
}
题目链接:https://leetcode.cn/problem-list/2cktkvj/