首页 > 其他分享 >2024-03-12 leetcode写题记录

2024-03-12 leetcode写题记录

时间:2024-03-12 19:22:06浏览次数:30  
标签:03 12 ListNode nullptr next 2024 headB headA last

目录

2024-03-12 leetcode写题记录

160. 相交链表

题目链接

160. 相交链表

题意

给你两个单链表的头节点\(headA\)和\(headB\),请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回\(null\)。

图示两个链表在节点\(c1\)开始相交:

题目数据保证整个链式结构中不存在环。

注意,函数返回结果后,链表必须保持其原始结构

节点定义:

struct ListNode {
    int val;
    ListNode* next;
    ListNode(int x) : val(x), next(NULL) {}
};

解法

解法一

刚看到这道题,想了下数学公式。

一、先遍历一遍A和B,看结尾是否相同,不同则意味着没有公共部分,返回nullptr。

二、如果结尾相同,设A链独有的长度为a,B链独有的长度为b,共有的长度为c。

(1)先从A开头遍历一遍,得到长度x,则x=a+c,同时反转整个A链;

(2)再从从B开头遍历一遍,得到长度y,则y=a+b,同时反转现在的链(即A独有部分和B独有部分串起来);

(3)最后从公共结尾开始遍历,得到长度z,则z=b+c,同时反转整个链(也就是整个B链),那么图形会变成初始模样。

可以得到:
\( \left\{ \begin{aligned} a+c=x\\ a+b=y\\ b+c=z \end{aligned} \right. \)

所以,A链独有部分的长度为\(\frac{x+y-z}{2}\),根据长度返回对应点就行

当没有公共点时,上述式子第二个等式不成立,所以不等式组是错误的,不能直接计算出长度,这也是为什么要分两种情况讨论,而不是直接求出c的长度判断是否为0。

class Solution {
   public:
    // 查链有多长,还可以选择是否反转链表
    int f(ListNode*& head, bool rvs = false) {
        int cnt = 0;
        ListNode *last = nullptr, *to = nullptr;
        while (head != nullptr) {
            cnt++;
            to = head->next;
            if (rvs) head->next = last;
            last = head;
            head = to;
        }
        head = last;
        return cnt;
    }

    ListNode* getLast(ListNode* x) {
        ListNode* last = nullptr;
        while (x != nullptr) {
            last = x;
            x = x->next;
        }
        return last;
    }

    ListNode* getIntersectionNode(ListNode* headA, ListNode* headB) {
        if (getLast(headA) != getLast(headB)) return nullptr;
        ListNode *ha = headA;
        int x = f(headA, true), y = f(headB, true), z = f(headA, true), a = (x + y - z) / 2;
        while (a--) ha = ha->next;
        return ha;
    }
};

解法二

看评论区,有更巧妙的想法:

如果两个链有相交,那么可以让两个指针分别从两个链开端进行遍历,每个指针遍历结束之后,都让指针跳到另一个链的开端继续遍历,这样当两个指针相同时,他们就都遍历了整个图,并且相聚在相交点。

两种写法时间复杂度上一样,但解法二写起来简单得多。

class Solution {
   public:
    ListNode* getLast(ListNode* x) {
        ListNode* last = nullptr;
        while (x != nullptr) {
            last = x;
            x = x->next;
        }
        return last;
    }

    ListNode* getIntersectionNode(ListNode* headA, ListNode* headB) {
        if (getLast(headA) != getLast(headB)) return nullptr;
        ListNode *a = headA, *b = headB;
        while (a != b) {
            a = a == nullptr ? headB : a->next;
            b = b == nullptr ? headA : b->next;
        }
        return a;
    }
};

标签:03,12,ListNode,nullptr,next,2024,headB,headA,last
From: https://www.cnblogs.com/FlyingLight/p/18069002

相关文章

  • Tomcat安装和配置,图文详解(2024)
    Tomcat安装和配置,图文详解(2024)一、Tomcat的下载和安装二、Tomcat环境变量的配置三、Tomcat的使用一、Tomcat的下载和安装1.进入Tomcat官网链接,我们可以看到左边这里有选择版本的链接,右边是对版本的一些介绍。2,选择版本,无论是9还是10都可以,不推荐使用最新版本的Tom......
  • 2024 信息安全专业毕业设计选题建议 毕设指导
    目录毕设选题选题迷茫选题的重要性更多选题指导最后 前言    大四是整个大学期间最忙碌的时光,一边要忙着准备考研,考公,考教资或者实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。大四的同学马上要开始毕业设计,对选题有疑问可以问学长哦(见......
  • 24.3.12
    所花时间:上一天课,代码量:400行博客量:6了解的知识点:Androidstudio、IDEA和MySQL联合开发,安卓使用okhttp进行http请求,使用json的格式进行数据传输到IDEA的web服务器,由web服务器解析进行数据库新增操作:实现代码:安卓端写在前面:安卓开发因为模拟器和电脑并不属于同一台机器,所以......
  • [Blazor] 学习随笔——RZ10012警告的处理
    程序能运行,就是告诉你RZ10012,然后各种提示没有了。清理解决方案、电脑重启了都没有用,后来搜索到github,解决了,记一下:关闭vs删除文件夹.vs,bin,object打开vs,重新生成解决方案也是醉了。文字少的博文不允许投稿到该网站分类?知道什么叫短小精悍吗?知道什么叫短小精悍吗?知道什......
  • PLSQL登录ora_12541无法识别连接符
       tnsnames.ora文件配置时,有一定的格式要求,一般从其他地方粘贴时,地址端口服务名都不会有什么问题,这时粘贴时要注意各行的格式要求:<ATOMICSCHEMANAME>=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=<HOSTNAME>)(PORT=<PORTNUMBER>)))(CON......
  • LY1060 [ 20230203 CQYC模拟赛IV T1 ] 放进去
    题意一共有\(n\)个物品,每个物品有\(m\)种种类。每个物品的每个种类的代价为\(a_{i,j}\)选择一种种类需要先支付\(b_i\)的代价。\(n\le1e5,m\le25\)求最小的代价使得能够选择\(n\)种物品。Sol考场上竟然没做出来。。。冲到最后20min交了发模拟退火。。。集......
  • 【专题】2024“破次元”数字社交文化观察报告合集PDF分享(附原数据表)
    原文链接:https://tecdat.cn/?p=35351原文出处:拓端数据部落公众号渴望财富自由带来生活重压,千万高校毕业生面临职场高标准,焦虑情绪凸显。Z世代虽独立,仍渴求亲密关系,多数独生子女依赖自我决策,同时渴望成为父母依靠。他们钟爱线上社交,日均手机使用超8小时,享受其带来的安全自由与个......
  • Unable to cast object of type 'Microsoft.EntityFrameworkCore.Query.Internal.Enti
    如题再做查询的时候报了这个错误。原代码如下:publicvirtualasyncTask<PagedList<ApiScope>>GetApiScopesAsync(stringsearch,intpage=1,intpageSize=10){varpagedList=newPagedList<ApiScope>();varfilteredApiScopes......
  • 2024-03-11 leetcode写题记录
    目录2024-03-11leetcode写题记录206.反转链表题目链接题意解法876.链表的中间结点题目链接题意解法2024-03-11leetcode写题记录206.反转链表题目链接206.反转链表题意给你单链表的头节点head,请你反转链表,并返回反转后的链表。解法链表反转板子题,特殊处理下一个点......
  • 叮!请查收昇思人工智能框架峰会2024邀请函
    昇思MindSpore人工智能框架峰会,北京国家会议中心,2024年3月21闭门会议,3月22日主论坛和开发者嘉年华,人工智能产学研用专家齐聚,诚邀各位开发者参加~~......