剑指Offer-38-两个链表的第一个公共节点

这是一篇关于解决寻找两个链表相交点问题的文章,介绍了三种不同的思路:使用集合记录第一个链表的节点,然后遍历第二个链表;利用栈辅助找到相交点;以及通过同步遍历两个链表直到找到公共节点。文章强调了解决问题时要注意链表的特性,并指出所有方法都假设链表中不存在环。
摘要由CSDN通过智能技术生成

题目

输入两个链表,找出它们的第一个公共结点。

解析

预备知识

2个单向链表相交后的示意图如下所示:
这里写图片描述
从上图的得知,若两个链表相交,那么这两个链表应该具有相同的尾部,也就是说呈现出Y型。因为单向链表中只有一个next域指向后继结点,所以从第一个相交点开始都是两个链表的公共部分,而不是我们思维惯性以为相交后就岔开了,不明白的再仔细看看上图即可。

思路一

空间换时间的做法,既然若相交,必有公共节点。所以我们可以申请一个set,遍历第一个链表,存放所有的节点。然后遍历第二个节点,若发现set中已存在该节点,那么就说明从这个节点开始两个链表相交,该节点就是第一个公共节点。

    /**
     * 空间换时间
     * @param pHead1
     * @param pHead2
     * @return
     */
    public static ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
        if(pHead1 == null || pHead2 == null) {
            return null;
        }
        Set<ListNode> set = 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值