链上相遇,节点之间的悸动与牵连

公主请阅
- 1. 返回倒数第 k 个节点
- 1.1 题目说明
- 1.2 题目分析
- 1.3 解法一代码以及解释
- 1.3 解法二代码以及解释
- 2.相交链表
- 2.1 题目说明
- 示例 1
- 示例 2
- 示例 3
- 2.2 题目分析
- 2.3 代码部分
- 2.4 代码分析
1. 返回倒数第 k 个节点

题目传送门
1.1 题目说明
题目名称:
面试题 02.02. 返回倒数第k个节点
题目要求:
实现一种算法,找出单向链表中倒数第 k 个节点,并返回该节点的值。
注意:
本题相对原题稍作改动。
示例:
输入:1 -> 2 -> 3 -> 4 -> 5 和 k = 2
输出:4
说明:
给定的k保证是有效的。
1.2 题目分析
这个题的话需要我们将倒数第k个节点进行返回,那么我们先想到的是什么呢?怎么找打倒数第k个节点呢?
解法一
那么这个时候我就想着将这个链表先逆置了,然后遍历k次我们就可以找到原先链表的倒数第k个节点了
这个是一种解法
解法二
要解决这个问题,我们可以使用 双指针(又称为 快慢指针)来找到链表中的倒数第 k 个节点。具体思路如下:
-
初始化两个指针,都指向链表的头节点。
- 快指针
fast - 慢指针
slow
- 快指针
-
移动快指针,先让
fast指针前进k步。 -
同时移动快慢指针,当
fast指针到达链表末尾时,slow指针的位置就是倒数第k个节点的位置。
详细步骤:
- 定义
fast和slow两个指针,初始时都指向链表头部。 - 让
fast先走k步,这样在之后的同时移动中,fast和slow之间的距离始终保持k。 - 然后同时移动
fast和slow,每次fast向后移动一格,直到fast到达链表的末尾。 - 此时,
slow就是倒数第k个节点。
那么下面我们会将两个解决方案的代码呈现出来的
1.3 解法一代码以及解释
/*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/int kthToLast(struct ListNode* head, int k)
{struct ListNode*prev=NULL;struct ListNode*cur=head;while(cur!=NULL)//遍历整个链表,将链表反转了{struct ListNode*tmp=cur->next;cur->next=prev;prev=cur;cur=tmp;}//到这里prev就是反转链表的头结点了while(--k){prev=prev->next;}return prev->val;
}//先将链表进行反转的操作,然后我们就可以直接利用循环来找到第k个节点了
先定义两个指针
-prev指向当前节点的前一个节点,初始化为NULL
cur指向当前节点,初始化为头结点
然后我们使用while循环进行遍历操作,直到我们遍历到尾节点我们就结束了
我们先定义一个指针tmp将当前节点的下一个节点进行保存了
然后我们现在开始将相邻的两个节点的指向进行改变的操作了
我们让当前节点的下个节点指向我们的prev,然后对prev这个指向进行更新,现在指向了我们当前的节点了,然后我们的cur也进行了更新了,指向当前节点的下个节点了,下个节点我们一开始使用tmp进行保存了,然后我们直接进行赋值就行了
等循环结束了,我们的链表的遍历操作就结束了,那么就说明我们的链表已经逆置成功了,那么现在我们的prev就是我们的头结点了
然后我们从这个头结点进行遍历操作,我们遍历k次,所以我们的循环条件是--k,前置–,返回的是-之前的值
等循环结束了,我们的perv就是我们原先链表的倒数第k个节点了,我们直接将这个节点的值进行返回就行了
1.3 解法二代码以及解释
int kthToLast(struct ListNode* head, int k){struct ListNode* first = head;struct ListNode* last = head;for(int i = 1; i < k ;i++)first = first->next;while(first->next){first = first->next;last=last->next;}return last->val;
}
我们先创建了两个指针fast和last,然后都初始化指向头结点,但是我们让块指针先走k步,然后我们继续使用while循环进行遍历操作,但是是快慢指针一起进行遍历,然后循环的条件就是快指针走到了尾节点的时候我们直接将尾节点的值进行返回就行了
但是这个原理是为什么呢?
双指针法的原理可以通过以下几点进行解释:
-
快慢指针之间的距离固定为 k
双指针法的核心思想是利用两个指针:一个“快指针”(fast)和一个“慢指针”(slow)。我们首先让 快指针先走k步,这样快指针和慢指针之间的距离就正好是k。 -
同时移动快指针和慢指针
接下来,当我们同时移动快慢指针时,快指针每走一步,慢指针也走一步。因为快指针最开始已经领先k步,因此当快指针走到链表末尾时,慢指针的位置就是倒数第k个节点。
- 具体来说,假设链表的长度为
n,当快指针走到末尾时,它已经走了n步。而由于快指针最开始比慢指针多走了k步,因此慢指针只走了n - k步,此时slow就恰好指向倒数第k个节点。
- 保持链表的一次遍历
通过这种方式,我们只需要遍历链表一次,而不是两次就可以得到倒数第k个节点。相比于朴素方法(先遍历链表得到链表长度,再遍历到目标节点位置)要遍历两次链表的时间复杂度,双指针法将时间复杂度从 O(2n) 优化到了 O(n)。
总结原理:
- 步数差:快指针和慢指针在一开始保持
k步的差距,这样当快指针到达末尾时,慢指针正好停在倒数第k个节点的位置。 - 一次遍历:只需要遍历链表一次就能完成任务,避免了多次遍历的低效。
- 指针同步移动:当快指针到达链表末尾时,慢指针正好位于我们想要的倒数第
k个节点。
2.相交链表

题目传送门
2.1 题目说明
从图中提取的题目信息如下:
题目描述
给你两个单链表的头节点 headA 和 headB,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,则返回 null。

注意:
- 整个链表结构中不存在环。
- 你不能更改链表的结构,链表必须保持其原始结构。
示例 1

输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,6,1,8,4,5], skipA = 2, skipB = 3
输出:Intersected at '8'
示例 2

输入:intersectVal = 2, listA = [1,9,1,2,4], listB = [3,2,4], skipA = 3, skipB = 1
输出:Intersected at '2'
示例 3

输入:intersectVal = 0, listA = [2,6,4], listB = [1,5], skipA = 3, skipB = 2
输出:null
输入参数:
intersectVal:相交的起始节点的值。如果不存在相交节点,则该值为 0。listA:链表 A。listB:链表 B。skipA:在链表 A 中(从头节点开始)跳到交叉节点的节点数。skipB:在链表 B 中(从头节点开始)跳到交叉节点的节点数。
输出:
- 如果链表相交,返回相交的起始节点的值;如果不相交,返回
null。
2.2 题目分析
这个题给我们两个链表,让我们找出两个链表的相交链表,然后将相交节点进行返回的操作,如果没有相交的节点的话我们直接返回NULL
那么这个题我们应该怎么进行设置呢?
可能给的两个链的长度不一样啊,那么我们应该怎么解决呢?
我们可以找出长链,然后计算出两个链的节点之差k,然后让长链走k次,那么我们的长链和短链就是同一个起点了,然后一起进行遍历的操作,边遍历边进行大小的比较的操作,如果两个链表遍历的指针相遇了的话,那么当前的指针所处的节点就是相交的节点了
那么思路就说到这里了,下面就是我们的代码的实践了
2.3 代码部分
/*** 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)
{if(headA==NULL||headB==NULL){return NULL;}//创建两个指针分别指向A和B两个链表ListNode*l1=headA;ListNode*l2=headB;//计算两个链表的节点的个数int sizeA=0,sizeB=0;while(l1!=NULL)//先遍历l1{sizeA++;l1=l1->next;}while(l2!=NULL)//先遍历l1{sizeB++;l2=l2->next;}//求差值int gap=abs(sizeA-sizeB);//绝对值//我们需要判断下谁是长链表//我们先假设ListNode*longlist=headA;ListNode*shortlist=headB;if(sizeA<sizeB){longlist=headB;shortlist=headA;}//到这里我们就知道长短链表了while(gap--){longlist=longlist->next;}//上面的代码是找到长链表然后让长链表的指针走差值while(longlist&&shortlist)//两个链表不为空的话我们就往后面走{if(longlist==shortlist)//说明相交了{return longlist;}//如果没有相交的话,那么我们的两个指针接着走longlist=longlist->next;shortlist=shortlist->next;}//到这里的话据说明没有相交的节点,我们直接返回空就行了return NULL;}
2.4 代码分析
我们先将特殊情况进行分析下,如果两个链表都是空的话,我们直接返回NULL就行了
然后我们就开始处理正常情况了
我们先创建两个指针分别指向我们的A和B两个链表,分别是l1和l2,指向对应链表的头结点
我们然后创建两个变量进行记录两个链表的头结点到尾节点的节点个数
然后我们就可以算出差值gap了,然后我们进行长短链表的判断假设,我们先假设长链表是A,然后加链表是B,如果sizeA<sizeB的话,那么长链表就是B,短链表就是A了
然后我们就可以将长短链表判断出来了
我们利用sizeA<sizeB算出了节点差值 gap,我们利用abs进行绝对值的操作
直到长链表是谁之后,我们让长链表走gap次
走完之后我们的两个链表一起进行遍历,使用while循环,条件是两个链表不为空我们就往后走
然后在循环里面进行判断,如果长链表的指针等于短链表的指针,那么就说明两个指针相遇了,那么这个节点就是我们想要的相交节点了
在这个条件判断之后我们进行两个指针的往后走一位的操作
如果出了循环还没有返回的话,那么就说明这两个链表是不存在相交的节点的,我们直接返回NULL就行了
相关文章:
链上相遇,节点之间的悸动与牵连
公主请阅 1. 返回倒数第 k 个节点1.1 题目说明1.2 题目分析1.3 解法一代码以及解释1.3 解法二代码以及解释 2.相交链表2.1 题目说明示例 1示例 2示例 3 2.2 题目分析2.3 代码部分2.4 代码分析 1. 返回倒数第 k 个节点 题目传送门 1.1 题目说明 题目名称: 面试题 02…...
一些简单的编程题(Java与C语言)
引言: 这篇文章呢,小编将会举一些简单的编程题用来帮助大家理解一下Java代码,并且与C语言做个对比,不过这篇文章所出现的题目小编不会向随缘解题系列里面那样详细的讲解每一到题,本篇文章的主要目的是帮助小编和读者们…...
java计算机毕设课设—愤怒小鸟游戏(附源码、文章、相关截图、部署视频)
这是什么系统? 资源获取方式再最下方 java计算机毕设课设—愤怒小鸟游戏(附源码、文章、相关截图、部署视频) 基于Java的愤怒小鸟游戏,我们不仅复刻了原版游戏的核心玩法,还增加了一些创新元素。游戏以2D图形界面呈现,玩家需要…...
【ARM】MDK-Flex服务管理软件使用说明
【更多软件使用问题请点击亿道电子官方网站】 1、 文档目标 记录MDK网络版部署工具Imtools.exe 的各个界面中相关配置的功能说明 2、 问题场景 解决客户咨询,该服务管理软件如何使用,为客户使用服务管理软件后期自行维护增加一定指导作用。 3、软硬件环…...
【H2O2|全栈】WPS/Office系列有哪些好用的快捷方式?
目录 WPS/Office 前言 准备工作 Office通用快捷键 PPT快捷键 Excel快捷键 Word快捷键 结束语 WPS/Office 前言 本章节属于前端前置知识,即使不学习前端,在工作中掌握常见的WPS/Office办公技能也是十分重要的。在本篇中,我将会分享常…...
对比学习)
目录 概念 数据增强 损失函数 NCE(noise contrastive estimation) Info NCE CV上的发展 InstDisc InvaSpread CPC CMC MoCo simCLR MoCo v2 SimCLR v2 SwAV BYOL SimSiam MoCo v3 DiNO 概念 通过利用样本之间的相似性和不相似性&…...
第十六届蓝桥杯嵌入式真题
蓝桥杯嵌入式第十二届省赛真题二 蓝桥杯嵌入式第十三届省赛真题一 蓝桥杯嵌入式第十三届省赛真题二 蓝桥杯嵌入式第十四届省赛真题 蓝桥杯嵌入式第十四届模拟考试一 蓝桥杯嵌入式第十四届模拟考试二 蓝桥杯嵌入式第十五届模拟考试一 蓝桥杯嵌入式第十五届模拟考试二 蓝…...
音频转码常用命令
1.转码为wav8k16bit -v提高音量 pitch调高音调 speed调整语速 sox -v 2.0 input.wav -r 8000 output.wav pitch 50 speed 1.05 sox input.wav -r 8000 output.wav 只是转码,不提高音调语速 压缩文件:zip -r filename.zip file1 file2 file3 2.批量转…...
INNER JOIN、LEFT JOIN 和 RIGHT JOIN有什么区别?什么是自连接?
INNER JOIN、LEFT JOIN 和 RIGHT JOIN 都是多表连接的不同方式,它们的主要区别在于它们如何处理表之间不匹配的数据。下面分别介绍它们的区别。 目录 一.多表连接查询 INNER JOIN(内连接) LEFT JOIN(左连接) RIGHT…...
原型模式具体和直接调用构造函数创建实例的区别
原型模式与直接调用构造函数创建实例的区别主要在于创建对象的方式和使用场景。让我们一步一步来理解。 直接调用构造函数创建实例 这是我们通常使用的创建对象的方法。通过调用类的构造函数,传入必要的参数来初始化对象。每次都要通过构造函数为对象设置所有初始值…...
MySQL 数据备份与恢复指南
本文将介绍如何通过命令行对 MySQL 数据库进行备份与恢复操作,适用于日常开发和生产环境中的数据管理需求。 1. MySQL 数据备份 MySQL 提供了 mysqldump 工具来执行数据库的备份操作,可以备份单个数据库、多个数据库或整个数据库实例。 1.1 备份单个数…...
NGINX 保护 Web 应用安全之基于 IP 地址的访问
根据客户端的 IP 地址控制访问 使用 HTTP 或 stream 访问模块控制对受保护资源的访问: location /admin/ { deny 10.0.0.1; allow 10.0.0.0/20; allow 2001:0db8::/32; deny all; } } 给定的 location 代码块允许来自 10.0.0.0/20 中的任何 IPv4 地址访问…...
数据结构——顺序表的基本操作
前言 介绍 🍃数据结构专区:数据结构 参考 该部分知识参考于《数据结构(C语言版 第2版)》24~28页 补充 此处的顺序表创建是课本中采用了定义方法为SqList Q来创建,并没有使用顺序表指针的方法,具体两个…...
智能去毛刺:2D视觉引导机器人如何重塑制造业未来
机器人技术已经深入到各个工业领域中,为制造业带来了前所未有的变革。其中,2D视觉引导机器人技术以其精准、高效的特点,在去毛刺工艺中发挥着越来越重要的作用。本文将为您介绍2D视觉引导机器人技术的基本原理及其在去毛刺工艺中的应用&#…...
计算机系统的层次
目录 计算机系统的层次ISA(指令集体系结构) 计算机系统的层次 计算机硬件是基础指令集体系结构:将硬件的功能封装从指令供软件使用操作系统:提供人机交互界面、提供服务功能的内核例程语言处理系统: 语言处理程序&…...
一起搭WPF架构之LiveCharts.Wpf的简单了解与安装
一起搭WPF架构之LiveCharts.Wpf的简单了解与安装 前言LiveCharts.Wpf介绍LiveCharts.Wpf的安装总结 前言 根据项目需求,我单独留了一个界面用于进行数据分析。数据分析的内容考虑是采用图表的形式将SQLite数据库中存储的数据进行绘制成图,以便数据分析。…...
深度学习杂乱知识
阿达玛乘积(Hadamard Product)详解 1. 定义: 阿达玛乘积(Hadamard Product),又称为元素乘积或逐元素乘积,是指对两个维度相同的矩阵进行逐元素相乘的操作。 假设我们有两个维度相同的矩阵 ( …...
本地编译运行Thingsboard-gateway之python版本——modbus数据采集
1、ideal 我用的是2020版本,这个关系不大,随便 Thingsboard-gateway之python版本源码拉取(老版本是java写的,新版都是python写的) 地址:git clone https://github.com/thingsboard/thingsboard-gateway.git…...
京东笔试题
和谐敏感词 🔗 题目地址 🎉 模拟 import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner new Scanner(System.in);int n scanner.nextInt();String s scanner.next();String[] words new String[…...
URP学习(一)
URP是unity出的比较简单的可供改造引擎渲染管线的流程。能实现用较低的代价消耗实现较好的效果。 现记录学习: 一.如何设置URP关键 这步结束后材质会被替换 加package Create/Rendering/URP Universal Rendering Setting设置为urp 材质也需要urp目录下的 几种…...
微信小程序之bind和catch
这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...
DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...
Java 二维码
Java 二维码 **技术:**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...
Netty从入门到进阶(二)
二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架,用于…...
基于IDIG-GAN的小样本电机轴承故障诊断
目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) 梯度归一化(Gradient Normalization) (2) 判别器梯度间隙正则化(Discriminator Gradient Gap Regularization) (3) 自注意力机制(Self-Attention) 3. 完整损失函数 二…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
ZYNQ学习记录FPGA(一)ZYNQ简介
一、知识准备 1.一些术语,缩写和概念: 1)ZYNQ全称:ZYNQ7000 All Pgrammable SoC 2)SoC:system on chips(片上系统),对比集成电路的SoB(system on board) 3)ARM:处理器…...
C++_哈希表
本篇文章是对C学习的哈希表部分的学习分享 相信一定会对你有所帮助~ 那咱们废话不多说,直接开始吧! 一、基础概念 1. 哈希核心思想: 哈希函数的作用:通过此函数建立一个Key与存储位置之间的映射关系。理想目标:实现…...
Java数组Arrays操作全攻略
Arrays类的概述 Java中的Arrays类位于java.util包中,提供了一系列静态方法用于操作数组(如排序、搜索、填充、比较等)。这些方法适用于基本类型数组和对象数组。 常用成员方法及代码示例 排序(sort) 对数组进行升序…...
小智AI+MCP
什么是小智AI和MCP 如果还不清楚的先看往期文章 手搓小智AI聊天机器人 MCP 深度解析:AI 的USB接口 如何使用小智MCP 1.刷支持mcp的小智固件 2.下载官方MCP的示例代码 Github:https://github.com/78/mcp-calculator 安这个步骤执行 其中MCP_ENDPOI…...
