【代码随想录算法训练营——Day4】链表——24.两两交换链表中的节点、19.删除链表的倒数第N个节点、面试题02.07.链表相交、142.环形链表II

LeetCode题目链接
https://leetcode.cn/problems/swap-nodes-in-pairs/
https://leetcode.cn/problems/remove-nth-node-from-end-of-list/
https://leetcode.cn/problems/intersection-of-two-linked-lists-lcci/description/
https://leetcode.cn/problems/linked-list-cycle-ii/

题解
24.两两交换链表中的节点
可以模拟一下画个图,注意设立虚拟头结点。

19.删除链表的倒数第N个节点
注意要找到被删除结点的前一个结点(这道题也是被提示这个思路才做出来的)。

面试题02.07.链表相交
启发思路:先求出两个链表长度,再求长度的差值,让长链表的指针移动到与短链表剩余长度相同的位置。
注意此题只能在leetcode上跑出正确结果,本地IDE运行时两个链表是单独建成不相交,所以无结果,下面附着的代码是本地代码。

142.环形链表II
拿到题目第一反应,开一个10的4次方的数组,作为判定链表中结点值是否出现过的判定(假定题目给的链表结点没有重复的,有重复的就不行了),如果当前结点的next结点的值显示为判定过,则链表存在环。
看了题解,采用快慢指针法。
本题根据题解,有两个地方需要注意,一是快慢指针遍历时的循环条件,我在代码里注释掉的是我自己写的,此时当结点只有一个时就会报错,因为快指针不存在下一个结点的next,下一个结点已然是NULL,因此在循环遍历时是判断快指针的存在与否与快指针的下一个结点存在与否;二是根据题解用数学方法求出环入口的位置,这段代码的循环要放在第一个循环里面,因为只有在第一个循环中发现有环后才能再寻找环入口。代码很简洁,重要的是思想。

代码

//24.两两交换链表中的节点
#include <iostream>
#include <vector>
using namespace std;struct ListNode {int val;ListNode *next;ListNode() : val(0), next(nullptr) {}ListNode(int x) : val(x), next(nullptr) {}ListNode(int x, ListNode *next) : val(x), next(next) {}};class Solution {
public:ListNode* swapPairs(ListNode* head) {if (head == NULL) return NULL;ListNode* pre1 = new ListNode;pre1->next = head;ListNode* pre2 = head;ListNode* pre3 = pre1;while (pre1!= NULL && pre2!= NULL && pre1->next != NULL && pre2->next != NULL) {int tmp = pre2->next->val;pre2->next->val = pre1->next->val;pre1->next->val = tmp;pre1 = pre1->next->next;pre2 = pre2->next->next;}return pre3->next;}
};ListNode* createList(vector<int> nums) {if (nums.size() == 0) return NULL;ListNode* cur = new ListNode(nums[0]);cur->next = NULL;ListNode* pre = cur;int len = 1;while (len < nums.size()) {cur->next = new ListNode(nums[len]);cur = cur->next;len++;}return pre;
}int main() {Solution s;vector<int> nums = { 1, 2, 3, 4, 5 };ListNode* node = createList(nums);ListNode* tmp = node;while (tmp != NULL) {printf("%d ", tmp->val);tmp = tmp->next;}printf("\n");node = s.swapPairs(node);while (node != NULL) {printf("%d ", node->val);node = node->next;}return 0;
}
//19.删除链表的倒数第N个节点
#include <iostream>
#include <vector>
using namespace std;struct ListNode {int val;ListNode *next;ListNode() : val(0), next(nullptr) {}ListNode(int x) : val(x), next(nullptr) {}ListNode(int x, ListNode *next) : val(x), next(next) {}
};ListNode* createList(vector<int>nums) {ListNode* cur = new ListNode(nums[0]);ListNode* pre = cur;int len = 1;while (len < nums.size()) {cur->next = new ListNode(nums[len]);cur = cur->next;len++;}return pre;
}class Solution {
public:int getListLen(ListNode* head) {int len = 0;while (head) {len++;head = head->next;}return len;}ListNode* removeNthFromEnd(ListNode* head, int n) {int len = getListLen(head);int num = len - n;ListNode* pre = new ListNode;pre->next = head;ListNode* pre2 = pre;while (num--) {pre = pre->next;}pre->next = pre->next->next;return pre2->next;}
};int main() {vector<int> nums = { 1,2 };ListNode* node = createList(nums);ListNode* tmp = node;while (tmp) {printf("%d ", tmp->val);tmp = tmp->next;}printf("\n");Solution s;node = s.removeNthFromEnd(node, 1);while (node) {printf("%d ", node->val);node = node->next;}return 0;
}
//面试题02.07.链表相交
#include <iostream>
#include <vector>
using namespace std;struct ListNode {int val;ListNode *next;ListNode(int x) : val(x), next(NULL) {}
};ListNode* createList(vector<int> nums) {if (nums.size() == 0) return NULL;ListNode* cur = new ListNode(nums[0]);ListNode* pre = cur;int len = 1;while (len < nums.size()) {cur->next = new ListNode(nums[len]);cur = cur->next;len++;}return pre;
}class Solution {
public:int getListLen(ListNode* head) {int len = 0;while (head) {len++;head = head->next;}return len;}ListNode* getIntersectionNode(ListNode* headA, ListNode* headB) {int lenA = getListLen(headA), lenB = getListLen(headB);if (lenA < lenB) {ListNode* tmp = headA;headA = headB;headB = tmp;}int diff = abs(lenA - lenB);while (diff) {headA = headA->next;diff--;}while (headA && headB) {if (headA == headB) return headA;headA = headA->next;headB = headB->next;}return NULL;}
};int main() {vector<int> nums1 = { 4,1,8,4,5 }, nums2 = { 5,0,1,8,4,5 };ListNode* headA = createList(nums1);ListNode* headB = createList(nums2);Solution s;ListNode* node = s.getIntersectionNode(headA, headB);ListNode* tmp = headA;while (tmp) {printf("%d ", tmp->val);tmp = tmp->next;}printf("\n");tmp = headB;while (tmp) {printf("%d ", tmp->val);tmp = tmp->next;}printf("\n");while (node) {printf("%d ", node->val);node = node->next;}return 0;
}
//142.环形链表II
class Solution {
public:ListNode* detectCycle(ListNode* head) {ListNode* slow = head, *fast = head;//do {while (fast && fast->next) {slow = slow->next;fast = fast->next->next;//} while (slow != fast && slow && fast);if (slow == fast) {ListNode* index1 = head, * index2 = slow;while (index1 != index2) {index1 = index1->next;index2 = index2->next;}return index1;}}return NULL;}
};

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

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

相关文章

C#中一段程序类比博图

using system //博图中要使用自带指令库&#xff0c;指令库名称叫systemnamespace Simple//博图建立程序&#xff0c;分诊断文件夹&#x1f4c2;&#xff0c;vision文件夹&#xff0c;通讯Db文件夹&#x1f4c2;等等&#xff0c;simple类似博图中的文件夹名称{class Program//程…

vue飞自在酒店管理系统(代码+数据库+LW)

摘 要 近年来&#xff0c;随着科技的迅猛进步和经济全球化的深入发展&#xff0c;互联网技术正以前所未有的速度提升社会综合发展的效能。这一技术的影响力已渗透到各行各业&#xff0c;其中&#xff0c;飞自在酒店管理系统在互联网时代背景下扮演着举足轻重的角色。信息管理…

2025年统计与数据分析领域专业认证发展指南

在数据驱动决策日益重要的背景下&#xff0c;专业认证作为提升统计学和数据分析能力的一种方式&#xff0c;受到越来越多从业者的关注。本文基于行业发展趋势&#xff0c;分析6个相关领域的专业资格认证&#xff0c;为专业人士提供参考。一、数据分析能力认证含金量CDA数据分析…

激光频率梳 3D 轮廓测量 - 油路板的凹槽深度和平面度测量

一、引言油路板作为液压系统核心部件&#xff0c;其凹槽深度与平面度精度直接影响油液流动特性与密封性能。传统测量方法在面对复杂油路结构时存在效率低、精度不足等问题。激光频率梳 3D 轮廓测量技术凭借时频基准优势&#xff0c;为油路板关键参数测量提供了新路径&#xff0…

七彩喜微高压氧舱:科技与体验的双重革新,重新定义家用氧疗新标杆

在高压氧舱市场竞争日益激烈的今天&#xff0c;七彩喜微高压氧舱凭借其独特的技术创新、极致的用户体验和贴心的服务生态&#xff0c;在众多品牌中脱颖而出。它不仅是一台设备&#xff0c;更是一个“懂你需求、护你健康”的智能健康伙伴。对比其他品牌&#xff0c;七彩喜的优势…

[光学原理与应用-418]:非线性光学 - 数学中的线性函数与非线性函数

线性函数与非线性函数是数学和工程领域中描述变量关系的基础工具&#xff0c;二者在定义、性质、图像特征及应用场景上存在本质差异。以下从核心概念、数学特性、图像对比、应用场景及实际案例五个维度展开详细分析&#xff1a;一、核心概念&#xff1a;线性 vs 非线性线性函数…

前端登录鉴权详解

1.cookie-session1. cookiecookie简单来说就是浏览器客户端在请求时会携带的一个字段数据&#xff0c;常用与保存当前用户状态并在请求时携带给服务端验证。2. sessionsession简单来说就是服务单对于每一个用户生成一个用户会话标识session /session id&#xff0c;并返回给客户…

从零实现 LLM(上):原理讲透 + 最小可运行 GPT

引言 为什么要学习 LLM&#xff1f; 当你和 ChatGPT 对话时&#xff0c;它不仅能回答你的问题&#xff0c;还能续写故事、记住上下文&#xff0c;甚至调整风格。你可能会想&#xff1a;它是怎么做到的&#xff1f; 答案就是&#xff1a;大语言模型&#xff08;Large Languag…

浪潮科技Java开发面试题及参考答案(120道题-下)

如何给 MySQL 表添加索引?添加索引的语法是什么?添加索引时需要考虑哪些因素(如字段类型、查询频率、索引选择性)? 给 MySQL 表添加索引需根据业务需求选择合适的索引类型,不同类型的索引语法不同,同时需综合评估字段特性、查询模式等因素,避免无效或过度索引。 一、…

大数据毕业设计选题推荐-基于大数据的宫颈癌风险因素分析与可视化系统-Spark-Hadoop-Bigdata

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

【PyTorch实战:Tensor变形】5、 PyTorch Tensor指南:从基础操作到Autograd与GPU加速实战

一、Tensor核心概念解析 1.1 什么是Tensor? Tensor是PyTorch中最基本的数据结构,也是深度学习框架的核心计算单元。我们可以将Tensor理解为多维数组的统一表示,它在PyTorch中的地位相当于NumPy中的ndarray,但具有两个关键增强特性:GPU加速支持和自动求导能力。 1.2 为…

2025年我国具身智能产业链全景分析

一、具身智能产业概述与定义 1.1 具身智能的基本概念与内涵 具身智能&#xff08;Embodied Intelligence&#xff09;是指通过物理实体与环境进行交互的智能系统&#xff0c;其核心在于将感知、决策和执行紧密结合&#xff0c;使智能体能够在动态环境中自主感知、学习和执行任务…

VMWare上搭建大数据集群

文章目录1. 采用软件较新版本2. 准备三台虚拟机3. 搭建Hadoop集群3.1 在主节点上配置Hadoop3.1.1 编辑映射文件3.1.2 配置免密登录3.1.3 配置JDK3.1.4 配置Hadoop3.2 从主节点分发到从节点3.3 格式化名称节点3.4 启动Hadoop集群3.5 使用Hadoop WebUI3.6 运行MR应用&#xff1a;…

小迪自用web笔记29

PHP刷新是点击刷新之后原来的图片替换掉&#xff0c;换成新的图片。把inhoneJPG给替换掉如果这个图片是由用户可自定义输入的话&#xff0c;可xss漏洞应用。因为这段代码本质逻辑是点击刷新之后。就执行update方法中的代码&#xff0c;而这个方法中存储的是。截取IMG&#xff0…

WPS--专业pj版

下载 下载链接 解压后 安装 默认安装 激活 输入解压后文件中的激活码

Android Framework智能座舱面试题

目录 1.谈一谈你对binder机制的理解?它为什么是Android中最重要的IPC通信方式?与其他IPC(Socket、共享内存)通信方式相比有哪些优势? 2.如果你需要新提供的车载硬件(比如:一个座椅震动马达)提供系统级别支持应该怎么做? 3.你了解Android与QNX共存方案的实现方式吗?他们…

[CISCN2019 华北赛区 Day1 Web1]Dropbox

TRY 首先上传和删除文件抓包&#xff0c;可以发现upload.php和delete.php&#xff0c;只允许上传gif png jpg后缀的文件。但是上传的文件并没有办法访问&#xff0c;不过可以下载&#xff0c;抓包发现下载的时候请求体是文件名&#xff0c;尝试能不能通过路径穿越获取源码&…

网站管理后台

这里套用的模板为 枫雨在线 在宝塔面板左侧选择菜单栏文件 在根目录下找到www文件夹&#xff0c;点击进入wwwroot文件夹&#xff0c;随后能看到域名文件夹&#xff0c;里面有一下初始内容&#xff0c;可以全部删掉&#xff0c;留下 .user.ini 文件 点击上传&#xff0c;将…

一款免费易用且打造的全功能媒体播放器

zyfun[zyplayer]是一款免费易用且打造的全功能媒体播放器, 致力于提供流畅、高效的跨平台娱乐体验。 注意&#xff1a;播放源请自行查询&#xff0c;或者联系博主。 下载&#xff1a;软件下载 在线体验可暂时使用:https://tv.snowytime.cn 密码为123456 &#x1f389; 功能亮点…

【AI产品思路】AI 原型设计工具横评:产品经理视角下的 v0、Bolt 与 Lovable

本文原创作者&#xff1a;姚瑞南 AI-agent 大模型运营专家/音乐人/野生穿搭model&#xff0c;先后任职于美团、猎聘等中大厂AI训练专家和智能运营专家岗&#xff1b;多年人工智能行业智能产品运营及大模型落地经验&#xff0c;拥有AI外呼方向国家专利与PMP项目管理证书。&#…