[豪の算法奇妙冒险] 代码随想录算法训练营第四天 | 24-两两交换链表中的节点、19-删除链表的倒数第N个节点、面试题02.07-链表相交、142-环形链表II

news/2025/11/24 22:39:15/文章来源:https://www.cnblogs.com/SchwarzShu/p/19266116

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


LeetCode24-两两交换链表中的节点

题目链接:https://leetcode.cn/problems/swap-nodes-in-pairs/description/

文章讲解:https://programmercarl.com/0024.两两交换链表中的节点.html

视频讲解:https://www.bilibili.com/video/BV1YT411g7br/?vd_source=b989f2b109eb3b17e8178154a7de7a51

​ 一拿到题目,我的思路是采用虚拟头节点保存Head的初始位置,先单独排除无元素和一个元素的情况,接着再单独处理两个元素的情况,之后如果符合条件再进行循环交换

​ 循环交换的时候,使用pre、cur和after三个指针遍历链表,进行cur和after所指节点的两两交换,关键在于确定何时停止循环和避免操作空指针

​ 总的来说还是要多画图、多分析

image-20251124092127596

class Solution {public ListNode swapPairs(ListNode head) {ListNode dummyHead = head;if(dummyHead == null || dummyHead.next == null){return dummyHead;}ListNode pre = null;ListNode cur = dummyHead;ListNode after = dummyHead.next;cur.next = after.next;after.next = cur;dummyHead = after;pre = cur;cur = cur.next;while(cur != null){after = cur.next;if(after == null){break;}pre.next = after;cur.next = after.next;after.next = cur;pre = cur;cur = cur.next;}return dummyHead;}
}

​ 看完Carl哥的讲解后,发现我的这个解法还能再活用dummyHead,进行逻辑的优化,统一操作链表,代码也更加简洁明了

image-20251124210232359

class Solution {public ListNode swapPairs(ListNode head) {ListNode dummyHead = new ListNode();dummyHead.next = head;ListNode cur = dummyHead;while(cur.next != null && cur.next.next != null){ListNode pre = cur.next;ListNode after = cur.next.next.next;cur.next = cur.next.next;cur.next.next = pre;pre.next = after;cur = cur.next.next;}return dummyHead.next;}
}

LeetCode19 删除链表的倒数第N个节点

题目链接:https://leetcode.cn/problems/remove-nth-node-from-end-of-list/description/

文章讲解:https://programmercarl.com/0019.删除链表的倒数第N个节点.html

视频讲解:https://www.bilibili.com/video/BV1vW4y1U7Gf/?vd_source=b989f2b109eb3b17e8178154a7de7a51

​ 采用快慢指针的思想解,快指针从dummyHead出发,先往后移动 n+1 步,然后快慢指针一起往后移动,直到快指针指向null,此时慢指针指向的是要删除的节点的前一个节点

image-20251124211822387

class Solution {public ListNode removeNthFromEnd(ListNode head, int n) {ListNode dummyHead = new ListNode();dummyHead.next = head;ListNode fast = dummyHead;ListNode slow = dummyHead;for(int i = 1;i <= n+1;i++){fast = fast.next;}while(fast != null){fast = fast.next;slow = slow.next;}slow.next = slow.next.next;return dummyHead.next;}
}

面试题02.07 链表相交

题目链接:https://leetcode.cn/problems/intersection-of-two-linked-lists-lcci/description/

文章讲解:https://programmercarl.com/面试题02.07.链表相交.html

​ 拿到题第一眼想到的是双重for循环暴力解,注意单个节点的情况,劈里啪啦写完发现居然能过,但这份代码一点也不优雅,而且时间复杂度来到O(n^2),得改!

image-20251124215047231

public class Solution {public ListNode getIntersectionNode(ListNode headA, ListNode headB) {if(headA == headB){return headA;}for(ListNode pA = headA; pA != null; pA = pA.next){for(ListNode pB = headB; pB != null; pB = pB.next){if(pA == pB){return pA;}}}return null;}
}

​ 看了题解后自己又写了一遍,大开眼界:可以先求出AB两个链表的长度,然后求出两个链表长度差值,让两个链表的末尾对齐,curA和curB对齐相对短的那一个,然后比较curA和curB是否相同,不同则同时往后移动curA和curB,如果遇到相同的情况则找到了交点,否则返回null。妙呀妙呀!

image-20251124220719855

public class Solution {public ListNode getIntersectionNode(ListNode headA, ListNode headB) {ListNode curA = headA;ListNode curB = headB;int lengthA = 1;int lengthB = 1;while(curA != null){curA = curA.next;lengthA++;}while(curB != null){curB = curB.next;lengthB++;}curA = headA;curB = headB;if(lengthA >= lengthB){for(int i = 1;i <= lengthA - lengthB;i++){curA = curA.next;}}else{for(int i = 1;i <= lengthB - lengthA;i++){curB = curB.next;}}while(curA != null){if(curA == curB){return curA;}curA = curA.next;curB = curB.next;}return null;}
}

LeetCode142 环形链表II

题目链接:https://leetcode.cn/problems/linked-list-cycle-ii/description/

文章讲解:https://programmercarl.com/0142.环形链表II.html

视频讲解:https://www.bilibili.com/video/BV1if4y1d7ob/?vd_source=b989f2b109eb3b17e8178154a7de7a51

​ 这题解法相当的妙呀,先定义一个快指针和一个慢指针,快指针每次往后走两个节点,慢指针每次往后走一个节点,它们如果相遇则说明链表存在环

​ 接着,由数学推理可以得出,从head到环入口的距离 = (n-1)圈环的距离 + 快慢指针相遇点到环入口的距离

​ 由此可以再定义index1从快慢指针相遇点出发,index2从head出发,它们都每次往后走一个节点,这样index1和index2相遇的节点即为环的入口节点

image-20251124223024764

public class Solution {public ListNode detectCycle(ListNode head) {ListNode fast = head;ListNode slow = head;while(fast != null && fast.next != null && fast.next.next != null){fast = fast.next.next;slow = slow.next;if(fast == slow){ListNode index1 = fast;ListNode index2 = head;while(index1 != index2){index1 = index1.next;index2 = index2.next;}return index1;}}return null;}
}

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

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

相关文章

【Android】详细讲解ViewDragHelper的达成原理(不含代码版)

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

不那么详细的多项式笔记

单位根 其实我们应该先学复数,但我觉得复数学过高中数学的应该都会。 令 \(z = a\cos \theta + a\sin \theta \mathrm{i} = (a, \theta)\),其中 \(a\) 为复数模长,\(\theta\) 为辐角。根据欧拉公式 \(e^{i\theta} =…

Java的线程池了解吗?

线程池介绍 什么是线程池 线程池是一种池化技术,用户预先创建并管理一组线程,避免频繁创建和销毁线程的开销,提高性能和响应速度 使用线程池的原因降低系统资源消耗:复用线程,不用重复创建,消耗资源 提升系统响应…

超简单!3步生成10W+爆款说唱视频!

不用花钱,不用技术,小白也能轻松搞定大家好,我是磊哥!今天给大家分享一个超级实用的干货——如何免费制作AI说唱视频! 先来看看效果: https://www.bilibili.com/video/BV1JVUCBVEsL/ 是不是很有意思?而且这一切…

深度解析2026美国研究生申请机构:从GPA到藤校,这些机构藏着关键方案

深度解析2026美国研究生申请机构:从GPA到藤校,这些机构藏着关键方案美国研究生申请向来以高竞争、多环节、政策多变著称,顶尖院校热门专业录取率常低于5%,标化成绩、科研实习、文书打磨等任一环节的疏漏都可能错失…

实用指南:介绍一下Ribbon

实用指南:介绍一下Ribbon2025-11-24 22:27 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; f…

P27_完整的模型训练套路(二)

P27_完整的模型训练套路(二)如何辨别模型在训练过程中有没有训练好以及有没有达到我需要训练的需求? 不需要对模型进行调优了,直接利用现有的模型来进行一个测试: 9.测试步骤开始: 用with torch.no_grad():环境取…

洛谷 P1496:火烧赤壁 ← 离散化(数组 + sort + STL map)

​【题目来源】https://www.luogu.com.cn/problem/P1496【题目描述】曹操平定北方以后,公元 208 年,率领大军南下,进攻刘表。他的人马还没有到荆州,刘表已经病死。他的儿子刘琮听到曹军声势浩大,吓破了胆,先派人…

P28_完整的模型训练套路(三)

P28_完整的模型训练套路(三)本节进行训练细节总结 打开官网:torch.nn.Module,可以查看train mode 和eval mode .train()和.eval()只对特定层如Dropout和BatchNorm层起作用,但是最好还是加上; 即在训练开始前加上…

奶酪和机器人 非标准化的步数遍历

当有不超过几步的时候 我们的遍历是:遍历带点所有可达状态 1.奶酪 垂直水平的遍历 也可以用第二种 for(int i=0;i<4;i++){for(int step=1;step<=k;step++){int nx=x+dx[i]*step;int ny=y+dy[i]*step;int nw=sw+…

6个适合做 PoC 的开源无代码/低代码工具推荐

汇总了 6 个适合快速构建 PoC 的开源低代码/无代码工具,为你提供在不同验证场景下的选择指南。原文链接:https://www.nocobase.com/cn/blog/6-open-source-no-low-code-tools-for-building-poc 如果在几年前你问一位…

2025年度木门厂商推荐榜单与选择指南:一份基于行业专业数据的权威分析报告,整木/实木/原木门十大主流供应商解析

在家居装修中,一扇好门不仅是空间的分隔,更是安全、静音与美学的集合体。在2025年,随着消费升级和健康家居理念深入人心,人们对木门的材质、工艺、环保标准乃至智能化程度都提出了更高要求。如何在众多品牌中精准锁…

C# Quartz 定损执行 - microsoft

在 C# 中,如果你想要使用 Quartz.NET 库来安排一个任务每小时执行一次,你可以使用 StdSchedulerFactory 类来创建一个调度器(Scheduler),并配置一个 Cron 触发器(CronTrigger)。 步骤 1: 安装 Quartz.NETInstal…

2025美国本科申请中介深度解析:适配不同背景的梦校推手,谁能助你敲开美国名校门?

2025美国本科申请中介深度解析:适配不同背景的梦校推手,谁能助你敲开美国名校门?美国本科申请以其复杂的网申系统、多元的评估维度及多变的招生政策,成为留学申请中的“硬骨头”。专业的申请中介能凭借对院校偏好的…

Rokid AI眼镜开发 —— 戴上Rokid Glasses的你有多强

我们team——看看你有多强队在Rokid 杭州赛中做的一款应用是"战斗力识别",这款产品是基于Rokid AI glasses的 产品,其后台是在灵珠平台上搭建的工作流。先说下设计思路和主要规则: 主要分四大块功能 :1.眼…

机器人的记忆化搜索

dp[][]从这个点为起点的路径数量 终点的自己到自己算一种 使用递推f()=所有出去之和 #include <bits/stdc++.h> using namespace std; int n,m; int g[105][105];int visited[105][105]; int dp[105][105];//从这…

# 数据库对AI向量语义搜索的支持深度分析:PostgreSQL、MySQL、Elasticsearch技术选型指南

# 数据库对AI向量语义搜索的支持深度分析:PostgreSQL、MySQL、Elasticsearch技术选型指南Posted on 2025-11-24 22:19 吾以观复 阅读(0) 评论(0) 收藏 举报关联知识库:# 数据库对AI向量语义搜索的支持深度分析…

# 编程十四年感悟:复杂度管理与工程实践

# 编程十四年感悟:复杂度管理与工程实践Posted on 2025-11-24 22:19 吾以观复 阅读(0) 评论(0) 收藏 举报关联知识库:# 编程十四年感悟:复杂度管理与工程实践编程十四年感悟:复杂度管理与工程实践原文链接:…

Ai元人文:行为化不是放弃概念,而是通往概念的坚实阶梯

Ai元人文:行为化不是放弃概念,而是通往概念的坚实阶梯 主流路径的困境在于,它试图让AI从一个它无法企及的终点(抽象概念)开始学习。这就像让一个婴儿先理解“爱情”的哲学定义,再去学习如何爱。 而“行为化”之路…

基于RS485通讯及Modbus通讯协议的温湿度变送器

基于RS485通讯及Modbus通讯协议的温湿度变送器组成: 1.主控芯片STC12C5A60S2 STC12C5A60S2是增强型8051CPU,1T,单时钟/机器周期,指令代码完全兼容传统8051,指令执行速度是其8-12倍,响应更快。内置1KB的EEPROM(S…