剑指 Offer 52. 两个链表的第一个公共节点

这篇具有很好参考价值的文章主要介绍了剑指 Offer 52. 两个链表的第一个公共节点。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


🚀 作者简介:一名在后端领域学习,并渴望能够学有所成的追梦人。
🚁 个人主页:不 良
🔥 系列专栏:🛸剑指 Offer  🛹Linux
📕 学习格言:博观而约取,厚积而薄发
🌹 欢迎进来的小伙伴,如果小伙伴们在学习的过程中,发现有需要纠正的地方,烦请指正,希望能够与诸君一同成长! 🌹


剑指 Offer 52. 两个链表的第一个公共节点

题目:

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

如下面的两个链表:
剑指 Offer 52. 两个链表的第一个公共节点

在节点 c1 开始相交。

示例1:

剑指 Offer 52. 两个链表的第一个公共节点

输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3
输出:Reference of the node with value = 8
输入解释:相交节点的值为 8 (注意,如果两个列表相交则不能为 0)。从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,0,1,8,4,5]。在 A 中,相交节点前有 2 个节点;在 B 中,相交节点前有 3 个节点。

示例2:

剑指 Offer 52. 两个链表的第一个公共节点

输入:intersectVal = 2, listA = [0,9,1,2,4], listB = [3,2,4], skipA = 3, skipB = 1
输出:Reference of the node with value = 2
输入解释:相交节点的值为 2 (注意,如果两个列表相交则不能为 0)。从各自的表头开始算起,链表 A 为 [0,9,1,2,4],链表 B 为 [3,2,4]。在 A 中,相交节点前有 3 个节点;在 B 中,相交节点前有 1 个节点。

示例3:

剑指 Offer 52. 两个链表的第一个公共节点

输入:intersectVal = 0, listA = [2,6,4], listB = [1,5], skipA = 3, skipB = 2
输出:null
输入解释:从各自的表头开始算起,链表 A 为 [2,6,4],链表 B 为 [1,5]。由于这两个链表不相交,所以 intersectVal 必须为 0,而 skipAskipB 可以是任意值。
解释:这两个链表不相交,因此返回 null

注意:

  • 如果两个链表没有交点,返回 null

  • 在返回结果后,两个链表仍须保持原有的结构;

  • 可假定整个链表结构中没有循环;

  • 程序尽量满足O(N)时间复杂度,且仅用 O(1) 内存。

思路一:

双指针法。

1.先定义两个指针fastslow分别记录链表中当前节点,再定义两个变量nAnB用来记录链表中节点个数;

2.然后分别遍历这两个链表,统计链表中节点个数,然后计算出节点个数差值dif并让节点个数多的链表先向前移动dif步;

3.再然后就是让两个指针同时向后移动,当两个指针相等时指针指向的就是两个链表的第一个公共节点。

剑指 Offer 52. 两个链表的第一个公共节点

代码如下:

class Solution {
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        ListNode* fast = headA; //记录A当前节点
        ListNode* slow = headB; //记录B当前节点
        int nA = 0; // A中节点个数
        int nB = 0; // B中节点个数
        //统计A中节点个数
        while(fast)
        {
            nA++;
            fast = fast->next;
        }
        //统计B中节点个数
        while(slow)
        {
            nB++;
            slow = slow->next;
        }
        fast = headA;
        slow = headB;
        int dif = nA - nB;
        //如果nA大于nB,先让fast先向前走dif步
        if(dif > 0)
        {
            while(fast && dif--)
            {
                fast = fast->next;
            }
        }
        //如果nA比nB小,先让slow向前走dif步
        else
        {
            dif = - dif; //dif小于0,-dif大于0
            while(slow && dif--)
            {
                slow = slow->next;
            }
        }
        //然后两个一起走,当两个指针相等时就是两个链表的第一个公共节点
        while(fast && slow && fast != slow)
        {
            fast = fast->next;
            slow = slow->next;
        }
        return fast;
    }
};

时间复杂度:O(M + N)M是链表A的长度,N是链表B的长度。

空间复杂度:O(1)文章来源地址https://www.toymoban.com/news/detail-495655.html

思路二:

哈希集合。

unordered_set容器即无序set容器,和set容器唯一的区别就是set容器会自行对存储的数据进行排序,而unordered_set容器不会进行排序。insert()插入函数;count()函数即当前值出现的次数。

1.遍历链表A,将链表A中的每个节点全部放入到容器中;

2.遍历链表B,判断B中当前节点是否在容器中;

  • 如果当前节点不在容器中,即count() == 0;则继续遍历下一个链表;

  • 如果当前节点在容器中,那么后面的节点都在该容器中,当前节点就是链表相交的第一个节点;

  • 如果B中所有节点都不在容器中,那么说明A和B这两个链表不相交,返回null

代码如下:

class Solution {
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        //实例化一个对象
        unordered_set<ListNode*> v;
        //先将链表中的节点都放到容器中
        ListNode* tmp = headA;
        while(tmp)
        {
            v.insert(tmp);
            tmp = tmp->next;
        }
        //然后再拿容器中的值和链表B中的节点比较,如果B中节点在容器中,那么后面的节点都在该容器中,当前节点就是链表相交的第一个节点
        tmp = headB;//代表链表B中当前节点
        while(tmp)
        {
            
            if(v.count(tmp))
            {
                return tmp;
            }
            tmp = tmp->next;
        }
        return nullptr;
    }
};

时间复杂度:O(M + N)M是链表A的长度,N是链表B的长度。

空间复杂度:O(1)

到了这里,关于剑指 Offer 52. 两个链表的第一个公共节点的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 算法通关村第一关---链表经典问题之两个链表的第一个公共节点笔记

    源码地址:GitHub-算法通关村 1.hash 2.集合 3.栈 4.双指针

    2024年02月16日
    浏览(33)
  • 剑指 Offer 35. 复杂链表的复制

    请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。 示例 1: 输入:head = [[7,null],[13,0],[11,4],[10,2],[1,0]] 输出:[[7,null],[13,0],[11,4],[10,2],[1,0]] 示例 2: 输入:head = [[1

    2024年02月15日
    浏览(38)
  • 《剑指offer》——合并两个排序的链表

    本期给大家带来的是  合并两个排序的链表 这道题的讲解!!!  接下来,我们还是先从题干的内容入手,先分析一波题目,在进行画图思考操作。 💨  题目如下: 示例1 输入:{1,3,5},{2,4,6} 返回值:{1,2,3,4,5,6} 示例2 输入:{},{} 返回值:{} 示例3 输入:{-1,2,4},{1,3,4} 返回值:

    2023年04月13日
    浏览(28)
  • 【剑指offer|图解|链表】删除链表的节点 + 训练计划 V

    🏠 个人主页:@聆风吟的个人主页 🔥系列专栏:本期文章收录在专栏《剑指offer每日一练》中,大家有兴趣可以浏览和关注,后面将会持续更新更多精彩内容! ⏰寄语:少年有梦不应止于心动,更要付诸行动。 🎉欢迎大家关注🔍点赞👍收藏⭐️评论📝 🌈作者留言:文章

    2024年02月08日
    浏览(38)
  • 【剑指offer|图解|链表】链表的中间结点 + 链表中倒数第k个结点

    🌈个人主页: 聆风吟 🔥系列专栏: 数据结构、算法模板 🔖少年有梦不应止于心动,更要付诸行动。      💬 hello! 小伙伴们大家好哇,今天作者给大家带来的是链表的相关面试题的讲解,在学习了下文之后,相信大家可以更好的理解链表,并且我们同过本文的练习相

    2024年02月05日
    浏览(37)
  • (链表) 剑指 Offer 25. 合并两个排序的链表 ——【Leetcode每日一题】

    难度:简单 输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。 示例1: 输入:1-2-4, 1-3-4 输出:1-1-2-3-4-4 限制 : 0 = 链表长度 = 1000 注意:本题与 21. 合并两个有序链表 相同 💡思路: 法一:递归 将该问题可以分解成子链表,只比较当前 l1 链

    2024年02月15日
    浏览(32)
  • Leetcode-每日一题【剑指 Offer 35. 复杂链表的复制】

    请实现  copyRandomList  函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个  next  指针指向下一个节点,还有一个  random  指针指向链表中的任意节点或者  null 。 示例 1: 输入: head = [[7,null],[13,0],[11,4],[10,2],[1,0]] 输出: [[7,null],[13,0],[11,4],[10,2],[1,0]] 示例 2: 输入

    2024年02月11日
    浏览(30)
  • 合并两个有序链表,将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

    题记: 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1: 输入 :l1 = [1,2,4], l2 = [1,3,4] 输出 :[1,1,2,3,4,4] 示例 2: 输入 :l1 = [], l2 = [] 输出 :[] 示例 3: 输入 :l1 = [], l2 = [0] 输出 :[0] 提示: 两个链表的节点数

    2024年02月07日
    浏览(49)
  • 剑指 Offer 09. 用两个栈实现队列

    🚀 作者简介:一名在后端领域学习,并渴望能够学有所成的追梦人。 🚁 个人主页:不 良 🔥 系列专栏:🛸剑指 Offer  🛹Linux 📕 学习格言:博观而约取,厚积而薄发 🌹 欢迎进来的小伙伴,如果小伙伴们在学习的过程中,发现有需要纠正的地方,烦请指正,希望能够与诸

    2024年02月08日
    浏览(24)
  • 剑指 Offer 24. 反转链表

    🚀 作者简介:一名在后端领域学习,并渴望能够学有所成的追梦人。 🚁 个人主页:不 良 🔥 系列专栏:🛸剑指 Offer  🛹Linux 📕 学习格言:博观而约取,厚积而薄发 🌹 欢迎进来的小伙伴,如果小伙伴们在学习的过程中,发现有需要纠正的地方,烦请指正,希望能够与诸

    2024年02月06日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包