单链表OJ题:LeetCode--160.相交链表

news2024/11/27 22:43:30

朋友们、伙计们,我们又见面了,本期来给大家解读一下LeetCode中第160道单链表OJ题,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成!

数据结构与算法专栏数据结构与算法

个  人  主  页 :stackY、

C 语 言 专 栏C语言:从入门到精通

 LeetCode--160.相交链表:https://leetcode.cn/problems/intersection-of-two-linked-lists/description/

目录

1.题目介绍

2.实例演示

3.解题思路


1.题目介绍

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

2.实例演示

3.解题思路

链表相交有一种别的说法叫做公共节点,但是不能吧链表相交理解为链表交叉,在我们学的链表结构中还不存在这种交叉的结构,因为每一个节点的next只有一个,不会有两个甚至更多,因此链表相交的结构得搞清楚。

如果我们仔细观察相交链表的特点,我们不难发现相交的两个链表的尾结点是一样的,因此在找两个单链表相交的起始节点的前提是两个链表必须相交,所以我们可以先判断两个链表的尾结点是否相等,如果不相等,那么直接返回NULL即可。所以需要遍历链表找尾节点

判断完链表是否相交之后我们该咋找两个单链表相交的起始节点呢?

这里有两种方法:

1. 暴力求解法:

将A链表的所有结点于B链表的所有结点依次进行比较,直到找到相等的结点。

但是这种方法太麻烦,代价比较大,时间复杂度为O(N*M)。要寻求其他解决办法。

2. 差距步法:

小编在这里给大家推荐一个比较简单的方法:分别求出两个链表的长度,然后较长的链表先走它们长度的差距步,然后两个链表再一起走,当两个链表相等就是相交点。因此我们可以在找两个链表的尾结点时顺便求出它们各自的长度。时间复杂度为O(N)。

在这里还要注意的一个点就是如何求出最长的链表,这里推荐使用假设法,假设A链表最长,然后判断A和B的长度,不符合条件就交换B为长链表,这样做的目的是代码不会冗余。

总结:

要求相交链表最简便的方法:

1. 先分别找两个链表的尾结点,并且分别求出两个链表的长度然后判断两个链表的尾结点是否相等,不相等则没有相交。

2. 若相等,则证明相交,此时找出最长的链表,让最长的链表先走它们两个链表长度的差距步,然后两个链表再一起走,走到相等的时候,则是两个链表的相交点。

 

代码演示:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
    struct ListNode* tailA = headA;
    struct ListNode* tailB = headB;
    int lenA = 1;
    int lenB = 1;
    //找A链表的尾结点并且求出链表的长度
    while(tailA->next)
    {
        tailA = tailA->next;
        lenA++;
    }
    //找B链表的尾结点并且求出链表的长度
    while(tailB->next)
    {
        tailB = tailB->next;
        lenB++;
    }
    //判断是否相交
    if(tailA != tailB)
        return NULL;

    //求出它们长度的差距
    int gap = abs(lenA - lenB);
    //找出最长的链表
    struct ListNode* longlist = headA;
    struct ListNode* shortlist = headB;
    if(lenA < lenB)
    {
        longlist = headB;
        shortlist = headA;
    }
    //长的先走差距步
    while(gap--)
    {
        longlist = longlist->next;
    }
    //再一起走,直到相等
    while(longlist != shortlist)
    {
        longlist = longlist->next;
        shortlist = shortlist->next;
    }
    return longlist;
}

 

朋友们、伙计们,美好的时光总是短暂的,我们本期的的分享就到此结束,最后看完别忘了留下你们弥足珍贵的三连喔,感谢大家的支持! 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/628872.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Lecture 19 Question Answering

目录 introductionIR-based QA (dominant approach)Knowledge-based QAHybrid QAConclusion introduction Definition: question answering (“QA”) is the task of automatically determining the answer for a natural language questionMostly focus on “factoid” quest…

牛客网论坛最具争议的Linux内核成神笔记,GitHub已下载量已过百万

原文地址&#xff1a;牛客网论坛最具争议的Linux内核成神笔记&#xff0c;GitHub已下载量已过百万 1、前言 Linux内核是一个操作系统&#xff08;OS&#xff09;内核&#xff0c;本质上定义为类Unix。它用于不同的操作系统&#xff0c;主要是以不同的Linux发行版的形式。Linu…

网红如何创建百度百科词条?

随着互联网的发展&#xff0c;越来越多的人开始从事网红行业。对于网红来说&#xff0c;提升自己的个人形象至关重要&#xff0c;一个提升品牌形象的快速方式就是创建百度百科词条。网红如何创建百度百科词条&#xff1f;如何创建一个高质量的百度百科词条&#xff1f;下面伯乐…

万维网服务器

一、域名解析gethostbyname函数 struct hostent {char *h_name; /* 官方域名 */char **h_aliases; /* 别名*/int h_addrtype; /* 地址族&#xff08;地址类型&#xff09; */int h_length; /* 地址长度 */char **h_addr_list; …

Qt扫盲-Qt事件系统概述

Qt事件系统概述 一、概述二、事件类型 - Event Types三、事件处理程序 - Event Handlers四、事件过滤器 - Event Filters五、发送事件 - Sending Events1. sendEvent()2. postEvent() 一、概述 在Qt中&#xff0c;事件是由抽象的QEvent类派生而来的对象&#xff0c;表示发生在…

凌恩全新育种分析流程!助力种质资源高分文章发表!

种质资源又称遗传资源。种质是指生物体亲代传递给子代的遗传物质&#xff0c;它往往存在于特定品种之中。如古老的地方品种、新培育的推广品种、重要的遗传材料&#xff0c;野生近缘植物以及利用上述繁殖材料创造的各种遗传材料&#xff0c;都属于种质资源的范围&#xff0c;是…

为什么要使用微软的 Application Framework?

我是荔园微风&#xff0c;作为一名在IT界整整25年的老兵&#xff0c;今天来看一下我们为什么要使用微软的 Application Framework&#xff1f; 虽然Application Framework 并不是新观念&#xff0c;它们却在最近数年才成为 PC 平台上软件开发的主流工具。面向对象语言是具体实…

【Spring Boot 初识丨三】starter

Soring Boot 初识 【Spring Boot 初识丨一】入门实战 【Spring Boot 初识丨二】maven 本篇来讲一讲 starter 依赖项 Starter 一、定义二、启动器2.1 应用启动器2.2 生产启动器2.3 技术启动器 一、定义 启动器是一组方便的依赖关系描述符&#xff0c;它包含了一系列可以集成到应…

并行事务会引发的三个问题

并行事务是指同时运行多个事务&#xff0c;每个事务独立地执行&#xff0c;并且不会相互影响。在数据库管理系统中&#xff0c;当多个用户同时对同一个数据集进行读取或者写入的时候&#xff0c;使用并行事务可以提高系统的吞吐量和响应时间。同时&#xff0c;由于并行事务可以…

c++学习之继承

目录 一&#xff0c;为什么需要继承 二&#xff0c;继承的基本概念 三&#xff0c;派生类的定义 四&#xff0c;继承中的析构预构造 1&#xff0c;子类中的构造与析构的顺序 2&#xff0c;子类调用成员对象&#xff0c;父类的有参构造 五&#xff0c;子类与父类的同名处理…

防雪崩利器之Hystrix

Hystrix作为一个容错组件&#xff0c;本文从它的作用、熔断设计、工作流程和应用方面一一道来&#xff0c;帮助大家了解如何使用。 1、什么是灾难性雪崩效应 要讲Hystrix&#xff0c;我们就要讲一种场景&#xff0c;在微服务架构中&#xff0c;如果底层服务出现故障&#xff0…

Ubuntu搭建APM固件编译环境

文章目录 前言一、下载源码二、配置编译环境三、编译固件 前言 Ubuntu20.04 APM 4.2.3 参考链接&#xff1a; https://ardupilot.org/dev/docs/building-setup-linux.html 一、下载源码 git clone https://github.com/ArduPilot/ardupilot.git下载完之后 cd ardupilotgit s…

Lecture 18 Information Extraction

目录 Named Entity RecognitionRelation ExtractionOther IE TasksConclusion information extraction Given this: “Brasilia, the Brazilian capital, was founded in 1960.”Obtain this: capital(Brazil, Brasilia)founded(Brasilia, 1960) Main goal: turn text into str…

Linux基本指令详细介绍 【Linux】

文章目录 ls 指令( list directory contents)ls -als -alls -dlls -l (ll)ls -alF文件的类型 &#xff1a; pwd命令(Print Working Directory)cd 命令 &#xff08;change directory&#xff09;cd ..cd ~cd - touch指令mkdir指令mkdir -p ( parents) treermdir指令&#xff08…

【数据结构】哈希应用

目录 一、位图 1、位图概念 2、位图实现 2.1、位图结构 2.2、比特位置1 2.3、比特位置0 2.4、检测位图中比特位 3、位图例题 3.1、找到只出现一次的整数 3.2、找到两个文件交集 3.3、找到出现次数不超过2次的所有整数 二、布隆过滤器 1、布隆过滤器提出 2、布隆过…

javaScript蓝桥杯----商城管理系统

目录 一、介绍二、准备三、目标四、代码五、完成 一、介绍 在商城管理系统中&#xff0c;超级管理员和普通管理员因为权限不同&#xff0c;登录进入后看到的菜单也会是不同的。 本题需要你完成商城管理系统中权限数据的处理。 二、准备 开始答题前&#xff0c;需要先打开本…

2023年,千万不要裸辞....

作为IT行业的大热岗位——软件测试&#xff0c;只要你付出了&#xff0c;就会有回报。说它作为IT热门岗位之一是完全不虚的。可能很多人回说软件测试是吃青春饭的&#xff0c;但放眼望去&#xff0c;哪个工作不是这样的呢&#xff1f;会有哪家公司愿意养一些闲人呢&#xff1f;…

硬件设计电源系列文章-LDO基础知识

文章目录 概要整体架构流程技术名词解释技术细节小结 概要 提示&#xff1a;这里可以添加技术概要 例如&#xff1a; 本文主要开始讲述电源的发展 整体架构流程 提示&#xff1a;这里可以添加技术整体架构 AC/DC转换基础。为什么需要AC需要DC 技术名词解释 提示&#x…

车载测试很难吗?我靠着这套面试资料拿下了16k车载测试offer!

目录 如何写简历 项目经验 如何准备面试 车载项目的实施 常见面试题 总结&#xff1a; 车载测试通常包含以下三个方面&#xff1a; 系统测试&#xff1a;对整车系统进行测试&#xff0c;如车载电子系统、底盘系统、动力系统等。系统测试主要是评估整车各项性能指标是否达到…

STM32单片机(四)第一节:OLED调试工具

❤️ 专栏简介&#xff1a;本专栏记录了从零学习单片机的过程&#xff0c;其中包括51单片机和STM32单片机两部分&#xff1b;建议先学习51单片机&#xff0c;其是STM32等高级单片机的基础&#xff1b;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 &#xff1a;适用于想要…