定个小目标之刷LeetCode热题(1)

有两种解决方法:

第一种:利用哈希集合不重复的特性,代码展示如下

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/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值