数据结构:单链表OJ题

目录

  • 相交链表
    • 解题思路
    • 代码
  • 环形链表(I)
    • 解题思路
    • 代码
  • 环形链表(II)
    • 解题思路
    • 代码
  • 随机链表的复制(深拷贝)
    • 解题思路
    • 代码

相交链表

题目描述:
在这里插入图片描述
案例:
在这里插入图片描述
在这里插入图片描述
题目链接:https://leetcode.cn/problems/intersection-of-two-linked-lists/description/

解题思路

既然要验证链表是不是相交的链表,就必须创建两个指针分别指向两个链表,当遍历时只要由一个节点满足两个指针相等,就说明是相交链表。
这里就要分情况了:

  1. 当两个链表长度相同时,让两个指针依次遍历数据直到两个指针相等或者有一个遍历结束置为NULL,相等就相交,反之则不相交。
  2. 两个链表长度不同,我们想让他们通过常规遍历肯定是不行了,但是根据第一种情况,我们可以通过一些操作使得两个链表长度相等,也就是两个指针在同一起跑线上,这样就把第二种情况转化成了第一种情况。
    那么怎么让两个指针在同一起跑线上,很简单,遍历两个指针,计数他们的长度,求出长度相差的绝对值n,让长节点的指针先走n步,然后两个链表再同时遍历即可。

代码

/**结构体格式* 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* l1=headA;ListNode* l2=headB;int num1,num2,tmp;//定义链表大小以及绝对值num1 =num2 =0;//求链表长度while(l1){num1++;l1=l1->next;}while(l2){num2++;l2=l2->next;}//定义长短链表ListNode* l=NULL;//长链表ListNode* s=NULL;//短链表if(num1>num2){tmp=num1-num2;l=headA;s=headB;}else{tmp=num2-num1;l=headB;s=headA;}//长链表先走n步while(tmp--){l=l->next;}//两个链表同时遍历while(l&&s){if(l==s){return l;}l=l->next;s=s->next;}return NULL;
}

环形链表(I)

题目描述:
在这里插入图片描述
案例:
在这里插入图片描述
题目链接:https://leetcode.cn/problems/linked-list-cycle/description/

解题思路

这个题目很简单,是比较经典的快慢指针问题。
快慢指针:定义两个指针,一个走得慢,一个走得快。
解题:
定义两个指针,一个快指针一个慢指针,慢指针一次走一步,快指针一次走两步,因为是环形链表,所以不会走到NULL,当碰到NULL停下来说明不是环形链表,但如果是环形链表就变成了类似于操场跑步的情况,快的和慢的终究会相遇,相遇就代表该链表有环。

代码

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/typedef struct ListNode ListNode;
bool hasCycle(struct ListNode *head) {ListNode* slow=head;//慢指针ListNode* fast=head;//快指针while(fast&&fast->next)//快慢指针遍历{//这里注意让指针先走在判断,刚开始两个指针都是指向首地址,如果不走直接判断就会导致无论什么情况都是有环的。fast=fast->next->next;slow=slow->next;if(fast==slow){return true;}}return false;
}

环形链表(II)

题目描述:
在这里插入图片描述
案例:
在这里插入图片描述
题目链接:https://leetcode.cn/problems/linked-list-cycle-ii/description/

解题思路

先通过快慢指针找到公共节点meet。
让⼀个指针从链表起始位置开始遍历链表,同时让⼀个指针从判环时相遇点(meet)的位置开始绕环运行,两个指针都是每次均⾛⼀步,最终肯定会在入口点的位置相遇。
可能会有人觉得不一定,这个只会在一些特定情况下实现,我们可以来试着证明一下。
在这里插入图片描述
注:M为相遇点,E为入环点,环长度为R
要满足上面的结论,就要满足L=R-X
我们可以通过快慢指针之间的关系来证明这个关系式的可靠性(慢指针走一步,快指针走2步)。
慢指针走的路程:L+X
快指针走的路:L+X+nR
既然他们能够相遇,就可以满足2*(L+X)=L+X+nR(快指针走的是慢指针的两倍)
进一步推导:
L+X=nR
L=nR-X
因为这是一个环,所以无论n是多少,他走完一圈就会再次回到原点,所以n在这里对这个关系式就没有影响,由此可得,上述结论是可行的。

代码

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/typedef struct ListNode ListNode;
struct ListNode *detectCycle(struct ListNode *head) {ListNode* slow,*fast;slow=fast=head;while(fast&&fast->next){fast=fast->next->next;slow=slow->next;if(fast==slow)//寻找相遇点{ListNode* meet=fast;//定义相遇点,为了可观性进行了重定义,也可以直接使用fast/slowListNode* pcur=head;while(pcur!=meet)//两个指针开始遍历{pcur=pcur->next;meet=meet->next; }return meet;}}return NULL;
}

随机链表的复制(深拷贝)

题目描述:
在这里插入图片描述
案例:
在这里插入图片描述
题目链接:https://leetcode.cn/problems/copy-list-with-random-pointer/description/

解题思路

  1. 创建新的链表,并且与原链表产生联系,将新链表的random初始化为NULL
    在这里插入图片描述

  2. 修改新链表的random
    分析题目可得,我们复制的链表中随机指针也要对应原链表在新链表中对应的位置。
    定义新链表为copy,观察上图,我们要修改新链表的random,只需要将新链表的random指向原链表指向的random->next。当原链表中random指向NULL,就不需要再做处理,因为我们初始化就是置random为NULL。
    举个例子:以13节点为例
    我们新链表中13节点要指向新链表7节点,7节点的位置再原链表13节点random指向的节点的下一个节点。
    pcur为我们创建的原链表头节点
    即copy->random=pcur->random->next;

    经过分析就可得,我们要创建两个指针分别指向新旧链表得头节点。

  3. 断开新旧链表的联系
    我们将原链表头节点走到要修改的新链表后面一个节点的位置,如图:
    在这里插入图片描述
    newhead为新链表头节点地址,newtail为新链表尾节点地址,
    将newtail->next指向pcur->next,
    将newtail向后移一位,pcur一直赋值为newtail的后一位。

代码

/*** Definition for a Node.* struct Node {*     int val;*     struct Node *next;*     struct Node *random;* };*/
typedef struct Node Node;
Node* BuyNode(int x)//创建新的节点
{Node* newnode=(Node*)malloc(sizeof(Node));newnode->val=x;newnode->next=newnode->random=NULL;return newnode;
}
struct Node* copyRandomList(struct Node* head) {if(head==NULL)//当链表为NULL单独处理{return NULL;}Node* pcur=head;//将新链表与原链表创建联系while(pcur){Node* newnode=BuyNode(pcur->val);newnode->next=pcur->next;pcur->next=newnode;pcur=newnode->next;}//修改新链表的randompcur=head;while(pcur){Node* copy=pcur->next;if(pcur->random!=NULL){copy->random=pcur->random->next;}pcur=copy->next;}//将新链表与原链表断开联系pcur=head;Node* newHead,*newTail;newHead=newTail=pcur->next;while(pcur->next->next){pcur=newTail->next;newTail->next=pcur->next;newTail=newTail->next;}return newHead;
}

----------------------------------------------------------------分隔符
西靠:慢指针走一步,快指针走3步、4步、5步…,快慢指针是否会相遇?
答案:一定会相遇。因为篇幅太长,就不做过多解释了。
有兴趣的可以尝试一下,当然也可以记住结论以后使用知道即可。
感谢各位的观看,有错请在评论区指正,谢谢!

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

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

相关文章

FunASR离线文件转写服务开发指南-debian-10.13

FunASR离线文件转写服务开发指南-debian-10.13 服务器环境 debian10.13 64位 第一步 配置静态网卡 auto eth0 iface eth0 inet static address 192.168.1.100 netmask 255.255.255.0 gateway 192.168.1.1 dns-nameservers 8.8.8.8 8.8.4.4/etc/init.d/networking restart第…

【JVM】JMM

文章目录 前置的硬件知识什么是JMMJMM的三大特性JMM中定义的原子操作happens-before先行发生原则 前置的硬件知识 硬件存储体系: 运行速度从上到下依次减慢. 由于CPU的计算速度远超与内存的处理速度,所以CPU不会直接从内存中读写,而是将内存中的变量拷贝一份副本放到CPU高速…

2022年下真题(案例分析)

一、数据流图 二、数据库设计 - ER图 三、面向对象设计 - 用例图、类图 四、算法

【人工智能】AI人工智能的重要组成部分,深入解析CNN与RNN两种神经网络的异同与应用场景和区别

文章目录 一、卷积神经网络(CNN)详解1. 特征与结构CNN的基本结构 2. 应用场景3. 代码示例 二、循环神经网络(RNN)详解1. 网络结构与特点RNN的基本结构 2. 应用场景3. 代码示例 三、CNN与RNN的异同点1. 相同点2. 不同点 四、CNN与R…

基于YOLOv8-deepsort算法的智能车辆目标检测车辆跟踪和车辆计数

关于深度实战社区 我们是一个深度学习领域的独立工作室。团队成员有:中科大硕士、纽约大学硕士、浙江大学硕士、华东理工博士等,曾在腾讯、百度、德勤等担任算法工程师/产品经理。全网20多万粉丝,拥有2篇国家级人工智能发明专利。 社区特色…

Vue使用@别名替换后端ip地址

1. 安装 types/node types/node 包允许您在TypeScript项目中使用Node.js的核心模块和API,并提供了对它们的类型检查和智能提示的支持。 npm install types/node --save-dev 比如安装之后,就可以导入nodejs的 path模块,在下面代码 import path…

闪电麦昆 语音控制齿轮行进轨迹,ESP32搭配语音控制板,串口通信,附视频演示地址

演示地址 https://www.bilibili.com/video/BV1cW421d79L/?vd_sourceb8515e53f6d4c564b541d98dcc9df990 语音控制板的配置 web展示页面 esp32 程序 #include <ESP8266WiFi.h> #include <ESP8266WebServer.h> #include <LittleFS.h> #include <WebSo…

STL之set、map的使用

STL之set、map 1. 序列式容器和关联式容器2. set系列的使⽤参考文档链接&#xff1a;2.1 set的介绍&#xff08;2&#xff09;set的增删查2.2 multiset的介绍 3 map3.1 参考文档3.2 map类的介绍3.3 pair类型介绍3.4 map的构造3.6 map的数据修改3.7 multimap和map的差异 1. 序列…

openpdf

1、简介 2、示例 2.1 引入依赖 <dependency><groupId>com.github.librepdf</groupId><artifactId>openpdf</artifactId><version>1.3.34</version></dependency><dependency><groupId>com.github.librepdf</…

python+yaml+pytest+allure接口自动化框架

建议想学自动化的同学&#xff0c;先花半个月一个月的时间&#xff0c;去b站极限学习一下有关python的基础内容&#xff0c;比如各种数据类型的特点&#xff0c;创建 转换等&#xff0c;还有面向对象的一些知识&#xff0c;否则直接看自动化框架&#xff0c;很难看懂理解&#…

根据请求错误的状态码判断代理配置问题

SafeLine&#xff0c;中文名 “雷池”&#xff0c;是一款简单好用, 效果突出的 Web 应用防火墙(WAF)&#xff0c;可以保护 Web 服务不受黑客攻击。 雷池通过过滤和监控 Web 应用与互联网之间的 HTTP 流量来保护 Web 服务。可以保护 Web 服务免受 SQL 注入、XSS、 代码注入、命…

2024顶级一区idea:多模态图像融合!

在图像处理的前沿领域&#xff0c;多模态图像融合技术正成为研究的热点&#xff0c;它通过整合来自不同来源的图像数据&#xff0c;为我们提供了更丰富的信息维度&#xff0c;从而显著提升图像处理的精确度和效率。 这项技术的核心优势在于能够捕捉并融合各种图像数据中的互补…

3D渲图软件推荐:打造高质量渲染效果

在现代设计领域&#xff0c;3D渲图已经成为展示设计方案和产品外观的重要手段。无论是建筑设计、产品设计还是影视动画&#xff0c;都需要借助专业的3D渲染图软件来实现逼真的视觉效果。 本文将为您介绍几款备受好评的3D渲染图软件&#xff0c;帮助您在项目中选择合适的工具。…

户外防火值守:太阳能语音监控杆的参数及技术特点

随着假期旅游的热潮日渐高涨&#xff0c;我们游览各大景区、公园或森林区域时&#xff0c;经常会与各种智能设备不期而遇。这些高科技产品不仅提升了旅游体验&#xff0c;更在无形中保障了游客的安全与景区的环境保护。在我最近的旅行经历中&#xff0c;尤其是在深圳大鹏旅游景…

开放式蓝牙耳机排行榜10强?分享值得安利的开放式耳机

​开放式耳机目前非常流行&#xff0c;它们以时尚、美观和舒适著称&#xff0c;迅速赢得了众多用户的喜爱&#xff0c;成为了耳机市场的新宠。与传统的入耳式耳机相比&#xff0c;开放式耳机佩戴更稳固&#xff0c;对耳朵也更为温和。尽管有些人认为它们价格不菲&#xff0c;甚…

项目_C_Ncurses_Flappy bird小游戏

Ncurses库 概述 什么是Ncurses库&#xff1a; Ncurses是一个管理应用程序在字符终端显示的函数库&#xff0c;库中提供了创建窗口界面、移动光标、产生颜色、处理键盘按键等功能。 安装Ncurses库&#xff1a; sudo apt-get install libncurses5-dev 头文件与编译&#xf…

Springboot自定义starter注入到第三方项目IOC容器里

一 Bean扫描 Springboot项目&#xff0c;我们不加ComponentScan注解&#xff0c;但是也能扫描到Controller、Service标记的类&#xff0c;为什么呢&#xff1f;关键在于启动类的SpringBootApplication注解&#xff0c;该注解由以下三个注解组成&#xff1a; SpringBootConfig…

关于BSV区块链覆盖网络的常见问题解答(下篇)

​​发表时间&#xff1a;2024年9月20日 在BSV区块链上的覆盖网络服务为寻求可扩展、安全、高效交易处理解决方案的开发者和企业家开辟了新的视野。 作为开创性的曼达拉升级的一部分&#xff0c;覆盖网络服务提供了一个强大的框架&#xff0c;用于管理特定类型的交易和数据访问…

如何将 html 渲染后的节点传递给后端?

问题 现在我有一个动态的 html 节点&#xff0c;我想用 vue 渲染后&#xff0c;传递给后端保存 思路 本来想给html的&#xff0c;发现样式是个问题 在一个是打印成pdf&#xff0c;然后上传&#xff0c;这个操作就变多了 最后的思路是通过 html2canvas 转化成 canvas 然后变成…

XUbuntu安装OpenSSH远程连接服务器

目录 打开终端。更新你的包索引安装OpenSSH服务器。在终端中输入以下命令&#xff1a;安装完成后&#xff0c;OpenSSH服务器会自动启动。查看主机 IP测试连接打开 cmd 终端SSH 连接虚拟机确认连接输入连接密码发现问题修改用户&#xff0c;尝试连接 打开终端。 更新你的包索引 …