【C++】LeetCode 160 相交链表

news/2025/2/22 22:16:16

今天再写一道算法题(这两周都写算法题有点摆烂)

题目

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

图示两个链表在节点 c1 开始相交:
如图
注意:

  1. 如果两个链表没有交点,返回 null.
  2. 在返回结果后,两个链表仍须保持原有的结构。
  3. 可假定整个链表结构中没有循环。
  4. 程序尽量满足 O(n) 时间复杂度,且仅用 O(1) 内存。

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

分析

如果你像我一样,上来就怀疑这题为什么没有交叉链表的话,那你的数据结构需要恶补下了。

这是链表的定义:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */

对于单链表来说,每个结点只会有1个后继,但可以有很多个前驱。因此这两个链表只要有一处公共结点,后面所有的结点就都是公共的。

此题的解法为双指针法

分别从两个链表的头指针开始,向下同步遍历,遍历完本链表后从对方链表的头指针开始,每次比较遍历到的结点,直到遍历的结点为公共结点,或者返回null代表没遍历到。

双指针法的正确性证明可以参考 LeetCode 官方的证明

代码

class Solution {
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        if (headA == nullptr || headB == nullptr) {
            return nullptr;
        }
        ListNode *pA = headA, *pB = headB;
        while (pA != pB) {
            pA = pA == nullptr ? headB : pA->next;
            pB = pB == nullptr ? headA : pB->next;
        }
        return pA;
    }
};

http://www.niftyadmin.cn/n/5046144.html

相关文章

基于 SpringBoot+Vue 的口腔管理平台,附源码,数据库

第一章 简介 本项目,是基于 Java SpringBoot 开发的,主要功能包括首页、个人中心、病例就诊信息管理、复查提醒管理、预约挂号管理、我的收藏管理、订单管理,前台首页;首页、牙齿保健产品、牙齿保护小知识、留言反馈、个人中心、…

【算法练习Day1】二分查找移除元素

​ ​📝个人主页:Sherry的成长之路 🏠学习社区:Sherry的成长之路(个人社区) 📖专栏链接:练题 🎯长路漫漫浩浩,万事皆有期待 文章目录 二分查找解决方法一&…

C++ final和override的作用,以及使用场合

C中的final和override都是用于限制函数的重载和派生类的继承。 final关键字的作用是防止类的成员函数被派生类重载。例如: class Base { public:virtual void foo() final; };class Derived : public Base { public:// 错误,无法重载 foo()virtual void…

Sentinel故障转移及实现原理

Sentinel故障转移及实现原理 一、哨兵模式的基本工作流程二、判断实例下线三、选举新主库四、哨兵模式弊端五、哨兵集群判断实例下线六、哨兵集群判断实例下线详细工作过程七、哨兵集群的通信八、哨兵和客户端的通信九、总结 一、哨兵模式的基本工作流程 redis在运行时会开启一…

vue/react/node项目通过eslint检查语法规范

首先 我们打开终端 全局安装依赖 npm install -g eslint然后 以管理员身份运行项目终端 输入 eslint --init然后 这里 在初始化时会问我们想如何使用它? 分别对应 仅检查语法 检查语法并发现问题 检查语法、发现问题并强制执行代码样式 这里建议第二种 第三种肯定是不行的 …

给旧电脑(Y430)重装win7系统

记录一次重装系统: 1、原本电脑没什么问题,只是有点卡,还没打算重装,我只是打算把垃圾清一下,看到提示系统不是正版,我掏出了kms激活工具准备顺手激活一下 2、激活过后电脑突然蓝屏且不能开机了&#x…

Windows11 手把手教授开放端口

首先在控制面板点击“系统与安全”,找到防火墙 然后点击“windows defender”打开防火墙 点击左侧目录栏中“高级设置” 点击“入站规则”,再点击新建入站规则(开放端口有开放入站端口与开放出站端口之分,这里讲入站端口的开放…

Django框架学习大纲

对于使用 Python 的 Django 框架进行 web 开发的程序员来说,以下几点是必须了解的。 环境配置与项目初始化 命令: pip install django django-admin startproject myproject解析: 使用 pip 安装 Django。使用 django-admin startproject …