有两种解决方法:
第一种:利用哈希集合不重复的特性,代码展示如下
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/