C语言/数据结构——(相交链表)

一.前言

今天在力扣上刷到了一道题,想着和大家一起分享一下这道题——相交链表https://leetcode.cn/problems/intersection-of-two-linked-lists废话不多说,让我们开始今天的分享吧。

二.正文

1.1题目描述

是不是感觉好长,我也这么觉得。哈哈,不过没办法,大家们凑合看一下吧,毕竟人家的题就那么长。

1.2题目分析

我想到有两种方法,一种是暴力求解,时间复杂度是O(N^2),还有一种是一种稍微巧妙一点的技巧,时间复杂度是(N)。

两种方法共同部分:

我们可以创建两个指针分别是指向headA和headB的 ,pcur1和pcur2。并让pcur1=headA

pcur2=pcurB。

我们首先需要判断该链表是不是相交链表,如果是,则返回相交链表的第一个相交节点。否则,返回NULL。那么如何判断该链表是不是相交链表呢?其实我们可以让pcur1和pcur2分别遍历两个链表的最后一个节点即可,如果pcur1=pcur2则说明两个链表至少有一个相交节点,毫无疑问这肯定是相交节点。反之,pcur1!=pcur2,则说明,不是相交链表。(值得注意的是,完成上面部分后,记得让pcur1=headA,pcur2=headB,因为pcur1和pcur2后续我们还需要重新遍历两个链表)

(i)暴力算法:

我们可以让headA中的每一个节点都与headB中的节点遍历一次,然后让headA的下一个节点,重复这个动作,直到headA的最后一个节点遍历结束。

这是该方法的代码:

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/
typedef struct ListNode ListNode;
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) 
{
ListNode* pcur1,*pcur2;
pcur1=headA;
pcur2=headB;
while(pcur1->next!=NULL)
{pcur1=pcur1->next;
}
while(pcur2->next!=NULL)
{pcur2=pcur2->next;
}
if(pcur2!=pcur1)
return NULL;
pcur1=headA;
pcur2=headB;
while(pcur1->next!=NULL)
{
while(pcur2->next!=NULL)
{
if(pcur1==pcur2)
return pcur1;
pcur2=pcur2->next;
}
pcur2=headB;
pcur1=pcur1->next;
}
return pcur1;
}

(ii)非暴力算法:

那么我们应该依据什么来遍历相对长度前的数据呢?我们可以利用在遍历A和B的同时,让代表A链表len1++来算出长度,同理len2是算出B的长度。定义一个变量gap=abs(len1-len2)算出绝对值,如果A链表长,则A链表先遍历gap个长度的节点,反之B链表长则,B链表先遍历gap个长度的节点。

最后的步骤是上图所示,相对长度中的上下节点依次比较。

三.结言

今天的题目分享就到此结束了,拜拜了,家人们。

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

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

相关文章

网络编程套接字和传输层tcp,udp协议

认识端口号 我们知道在网络数据传输的时候,在IP数据包头部有两个IP地址,分别叫做源IP地址和目的IP地址。IP地址是帮助我们在网络中确定最终发送的主机,但是实际上数据应该发送到主机上指定的进程上的,所以我们不仅要确定主机&…

OAuth 2.0 和 OAuth 2.1

OAuth 2.0 和 OAuth 2.1比较: OAuth 2.0 和 OAuth 2.1 是授权框架的不同版本,它们用于允许应用程序安全地访问用户在另一个服务上的数据。以下是它们之间的一些主要区别: 安全性增强:OAuth 2.1 旨在提高安全性,它整合…

什么是云原生架构,我们该如何做好云原生安全,引领云计算时代的应用程序革新

随着云计算技术的飞速发展,企业面临着前所未有的机遇和挑战。在这个高度竞争的市场中,传统的应用程序架构因其僵化、不易扩展和维护的特点,已难以满足当今企业对灵活性、可伸缩性和高效性的追求。在这样的背景下,云原生架构应运而…

git rebase 合并当前分支的多个commit记录

git rebase 合并当前分支的多个commit记录 git rebase 相关的选项和用法step1:找到想要合并的 commitstep2. 使用 rebase -istep3. 编辑提交历史:step4.编辑合并后的提交信息step5.完成 rebase 过程:step6.**推送更新:**step6.**再…

使用ollama离线部署小模型

在有网的机器下载ollama和模型 启动服务 docker run --rm -it -v ./ollama:/root/.ollama -p 8000:11434 --name ollama ollama/ollama下载模型 docker exec -it ollama ollama pull qwen:0.5b将镜像和ollama目录复制到离线的机器中 docker启动ollama服务 验证 curl ht…

FFmpeg常用API与示例(三)—— 音视频解码与编码

编解码层 1.解码 (1) 注册所有容器格式和 CODEC:av_register_all() (2) 打开文件:av_open_input_file() (3) 从文件中提取流信息:av_find_stream_info() (4) 穷举所有的流,查找其中种类为 CODEC_TYPE_VIDEO (5) 查找对应的解码器:avcodec_find_decoder() (6) …

C++ 实现以xml的格式写入文件

C XML类 该类主要将xml中的标签分为两类&#xff0c;无内容标签统一称为父标签&#xff0c;有内容的就以键值对的方式直接输出。 后面可能会优化通过函数参数的方式管控层级关系&#xff0c;现在是通过类里自动记录层级深度来表示的。 #include <fstream> #include <…

【QT教程】QT6硬件图形界面编程 QT硬件编程

QT6硬件图形界面编程 使用AI技术辅助生成 QT界面美化视频课程 QT性能优化视频课程 QT原理与源码分析视频课程 QT QML C扩展开发视频课程 免费QT视频课程 您可以看免费1000个QT技术视频 免费QT视频课程 QT统计图和QT数据可视化视频免费看 免费QT视频课程 QT性能优化视频免费看…

数据结构-二叉树结尾+排序

一、二叉树结尾 1、如何判断一棵树是完全二叉树。 我们可以使用层序遍历的思路&#xff0c;利用一个队列&#xff0c;去完成层序遍历&#xff0c;但是这里会有些许的不同&#xff0c;我们需要让空也进队列。如果队列里到最后只剩下空那么这棵树就是完全二叉树。具体的实现如下…

js 数据格式转换,对象转数组,数组转对象

1.对象转数组 // 对象obj转换成数组格式 let obj { orgCode:分局编码, alertId:告警ID, name:告警名称 } let arr [] for(let key in obj) { console.log(11,key,obj[key]); // 定义一个对象&#xff0c;赋值 let o { id: key, // key是obj对象的键值 label: obj[key] …

学习Vue 3.0中的onMounted和onUnmounted钩子函数

学习Vue 3.0中的onMounted和onUnmounted钩子函数 一、什么是onMounted和onUnmounted&#xff1f;二、如何使用onMounted和onUnmounted&#xff1f;1、使用onMounted2、使用onUnmounted 三、总结 一、什么是onMounted和onUnmounted&#xff1f; Vue 3.0带来了许多令人兴奋的新特…

Modal h函数写法

Modal h函数写法 if (res.data.flag) {const ocapWarn res.data.ocaplList;Modal.warning({title: "提示",content: h("div", {}, [ocapWarn.map((item, index) > {return h("div", {}, [h("p",${index 1}、${item.defectItem}(…

IntersectionObserver对象

IntersectionObserver对象 IntersectionObserver对象&#xff0c;从属于Intersection Observer API&#xff0c;提供了一种异步观察目标元素与其祖先元素或顶级文档视窗viewport交叉状态的方法&#xff0c;祖先元素与视窗viewport被称为根root&#xff0c;也就是说Intersectio…

c#---多态

在 C#语言中体现多态有三种方式&#xff1a;虚方法&#xff0c;抽象类&#xff0c; 接口 一、虚方法 什么是虚方法&#xff1f; 在父类中使用 virtual 关键字修饰的方法&#xff0c; 就是虚方法。在子类中可以使用 override 关键字对该虚方法进行重写。 class Animal {public…

android apk没有源码如何修改程序

如果您拥有一个APK文件但没有源代码&#xff0c;您可以尝试以下几种方法来进行修改&#xff1a; 反编译APK&#xff1a;使用工具如apktool对APK文件进行反编译&#xff0c;这将为您提供源代码和资源文件。 动态调试&#xff1a;使用调试工具连接设备或模拟器&#xff0c;并动态…

重装前端整体流程

用户管理 --汇总 -- 明细-CSDN博客 一、node 这个看环境变量 2023最新版Node.js下载安装及环境配置教程&#xff08;非常详细&#xff09;从零基础入门到精通&#xff0c;看完这一篇就够了_nodejs安装及环境配置-CSDN博客 配置到国内镜像的时候&#xff0c;去看&#xff0c;淘…

理解固化的Maven依赖:spring-boot-starter-parent 与 spring-boot-dependencies

目录 理解固化的Maven依赖&#xff1a;spring-boot-starter-parent 与 spring-boot-dependencies1. spring-boot-starter-parent1.1 简介1.2 特点 2. spring-boot-dependencies2.1 简介2.2 特点 3. 异同点对比3.1 相同点3.2 不同点案例一&#xff1a;使用 spring-boot-starter-…

Java方法的重载

方法重载 1. 为什么需要方法重载 public class TestMethod{public static void main (String[] args){int a 10;int b 20;int ret add(a,b);System.out.println("ret "ret);double a2 10.5;double b2 20.5;double ret2 add(a2,b2);System.out.println("…

《QT实用小工具·六十二》基于QT实现贝塞尔曲线画炫酷的波浪动画

1、概述 源码放在文章末尾 该项目实现了通过贝塞尔曲线画波浪动画&#xff0c;可控制 颜色密度速度加速度 安装与运行环境 语言&#xff1a;C 框架&#xff1a;Qt 11.3 平台&#xff1a;Windows 将屏幕水平平均分为10块&#xff0c;在一定范围内随机高度的12个点&#xff08;…

飞天使-k8s知识点29-kubernetes安装1.28.0版本

文章目录 选用版本初始化服务器,自己修改里面的ipreboot haproxy安装 &#xff0c;可以参考我之前写的内核参数调整&#xff0c;安装docker 安装cri-dockerd开始安装集群工具下载镜像以及启用完毕之后 此时的coredns 不通结果展示 选用版本 k8s 1.24版本之前还可以使用docker&…