【C++】LeetCode 160 相交链表

2023-09-17 17:57:58

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

题目

给你两个单链表的头节点 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;
    }
};
更多推荐

JavaScript 基础 - 第1天笔记

JavaScript基础-第1天了解变量、数据类型、运算符等基础概念,能够实现数据类型的转换,结合四则运算体会如何编程。体会现实世界中的事物与计算机的关系理解什么是数据并知道数据的分类理解变量存储数据的“容器”掌握常见运算符的使用,了解优先级关系知道JavaScript数据类型隐式转换的特征介绍掌握JavaScript

头歌平台相关verilog练习

以下题目不具有难易程度的连续性文章目录1、三人表决电路2、多路选择器3、电路功能描述—门级原始结构4、电路功能描述—行为定义—连续赋值5、电路功能描述—行为定义—过程语句1、三人表决电路本关需要你根据所学的组合逻辑及数字电路的知识完成三人表决电路的设计,实现少数服从多数的表决规则,根据逻辑真值表和逻辑表达式完成表决功能

netty之数据读写源码阅读

数据读写write从client端的写开始看client与服务端建立完connect后可以从future里拿到连接的channel对象。这里的channel是io.netty.channel.Channel对象。调用其channel.writeAndFlush(msg);方法可以进行数据发送。writeAndFlush

Android 应用上线注意事项

将Android应用上线到GooglePlay商店需要仔细注意一系列问题,以确保应用的质量、安全性和用户体验。以下是一些在Android应用上线过程中需要注意的关键问题,希望对大家有所帮助。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎交流合作。1.开发者账号:确保你拥有有效的GooglePlay开发者账号,可

【ASP.NET Core】应用脱机文件 (app_offline.htm)

文章目录概述锁定的部署文件来源jenkins进行CI失败是可能app_offline.htm不会被自动删除导致ASP.NETCore应用异常,发布成功后则需手动删除该文件概述在很多情况下,需要在对相关组件(如数据库或Web服务)进行更改时使Web应用程序脱机。通常,在IIS和ASP.NET中,可以通过将名为App_of

【深度学习实验】前馈神经网络(四):自定义逻辑回归模型:前向传播、反向传播算法

目录一、实验介绍二、实验环境1.配置虚拟环境2.库版本介绍三、实验内容0.导入必要的工具包1.逻辑回归Logistic类a.构造函数__init__b.__call__(self,x)方法c.前向传播forwardd.反向传播backward2.模型训练3.代码整合一、实验介绍实现逻辑回归模型(Logistic类)实现

动态规划:子序列问题(C++)

动态规划:子序列问题前言子序列问题1.最长递增子序列(中等)2.摆动序列(中等)3.最长递增子序列的个数(中等)4.最长数对链(中等)5.最长定差子序列(中等)6.最长的斐波那契子序列的长度(中等)7.最长等差序列(中等)8.等差数列划分II-子序列(困难)前言动态规划往期文章:动态规划入门:斐波那契数列模型以及多状态

8种结构型设计模式对比

一、适配器模式简介适配器模式是一种结构型设计模式,它用于将不兼容的接口转换为可兼容的接口。适配器模式允许两个不兼容的类能够协同工作,通过将一个类的接口转换为另一个类所期望的接口形式。这样就能够在不修改现有代码的情况下,使两个不兼容的类能够相互协作。使用场景适配器模式通常在以下场景中使用:当需要将现有类的接口转换为其他接

Llama2-Chinese项目:2.1-Atom-7B预训练

虽然Llama2的预训练数据相对于第一代LLaMA扩大了一倍,但是中文预训练数据的比例依然非常少,仅占0.13%,这也导致了原始Llama2的中文能力较弱。为了能够提升模型的中文能力,可以采用微调和预训练两种路径,其中:微调需要的算力资源少,能够快速实现一个中文Llama的雏形。但缺点也显而易见,只能激发基座模型已有的

el-table表格动态设置最大高度 高度根据窗口可视高度大小改变自适应

由于表格内容过多,如果不给高度限制,每页100条数据的情况下,去操作底部的分页或者其他功能都需要划到数据最底部操作,用户体验性较差。解决方法是让表格一屏展示,超出部分滚动展示。1.效果及思路图:思路是:屏幕可视区域-最大盒子的上下内边距-搜索部分-按钮部分-分页部分因为表格是项目公用表格每个项目需求不同根据实际需求去减

推荐一些常用的api接口,包括天气、物流、IP查询等

天气预报查询:支持输入经纬度或者区域编码查询全国以及全球多个城市的天气,包含15天天气预报查询。天气预警:支持输入经纬度或者区域编码,获取指定城市当前生效中的各类天气预警,如寒潮蓝色预警信号,或一次性拉取全国所有生效中的天气预警。空气质量查询:支持输入经纬度或者区域编码查询国内3400+个城市的整点观测,获取指定城市的

热文推荐