代码随想录算法训练营day4 | 24.两两交换链表中的节点、19.删除链表的倒数第N个节点、160.相交链表、142.环形链表Ⅱ

news/2025/2/24 6:19:45/文章来源:https://www.cnblogs.com/coderjxj/p/18717334

24.两两交换链表中的节点

点击查看代码
/*** Definition for singly-linked list.* 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 == nullptr || head->next == nullptr) return head;ListNode *dummyhead = new ListNode(-1, head);ListNode *zero = dummyhead; //指向虚拟头节点ListNode *first = head; //指向第一个节点ListNode *second = head->next; //指向第二个节点while(1) {zero->next = second; //步骤一first->next = second->next; //步骤三second->next = first; //步骤二//有完整的一对,即两个链表节点才交换if(first->next == nullptr || first->next->next == nullptr) break; zero = first;  //相当于新的虚拟头节点first = zero->next; //下一组中的第一个节点second = first->next; //下一组中的第二个节点}head = dummyhead->next;delete dummyhead;return head;    }
};

将虚拟头节点、待交换的第一个节点、待交换的第二个节点视为一组,分别进行步骤一、步骤三、步骤二,然后判断下一轮是否有完整的一对,即两个可交换的链表节点,若有,则更新三个指针,分别指向新的虚拟头节点、待交换的第一个节点、待交换的第二个节点,然后进行重复操作

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

点击查看代码
/*** Definition for singly-linked list.* 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* removeNthFromEnd(ListNode* head, int n) {ListNode *dummyhead = new ListNode(-1, head);ListNode *slow = dummyhead, *fast = dummyhead;int count = 0;while(count++ < n+1) fast = fast->next; while(fast) {slow = slow->next;fast = fast->next;}ListNode *q = slow->next;slow->next = q->next;delete q;head = dummyhead->next;delete dummyhead;return head;}
};

核心思路:fast指针先走n+1步(注意,不是n,而是n+1,因为要找到倒数第n个节点的前驱节点),然后slow指针和fast指针一起往前走,直到fast指针走到nullptr,此时slow指针所指即为倒数第n个节点的前驱节点
本题所给提示中,1 <= n <= size,故不会出现n非法的情形,无需作特殊处理,一趟扫描即可完成。

160.相交链表
解法一:

点击查看代码
/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode(int x) : val(x), next(NULL) {}* };*/
class Solution {
public:ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {ListNode *p_A = headA, *p_B = headB;int size_A = 0, size_B = 0;while(p_A) { //求A链表长度++size_A;p_A = p_A->next;}while(p_B) { //求B链表长度++size_B;p_B = p_B->next;}int count = abs(size_B - size_A); //求A、B链表长度差p_A = headA, p_B = headB;while(count-- > 0) { //长链表的指针先走count步,走完后长短链表指针一起走if(size_A > size_B) p_A = p_A->next;else p_B = p_B->next;}while(p_A) { //长短链表指针一起走,若有相交节点,必能同时到达相交节点处if(p_A == p_B) return p_A;p_A = p_A->next;p_B = p_B->next;}return nullptr; //前面都没返回,说明没有相交节点}
};
解法二:

点击查看代码
/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode(int x) : val(x), next(NULL) {}* };*/
class Solution {
public:ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {ListNode *p_A = headA, *p_B = headB;int count_A = 0, count_B = 0;while(p_A && p_B) {if(p_A == p_B) return p_A;if(p_A->next == nullptr) {if(count_A == 0){p_A = headB;++count_A;}else return nullptr;}else p_A = p_A->next;if(p_B->next == nullptr) {if(count_B == 0){p_B = headA;++count_B;}else return nullptr;}else p_B = p_B->next;}return nullptr;}
};

解法二核心思想:p_A走完A链表后走B链表,p_B走完B链表后走A链表,若有相交节点,必然能同时到达相交节点处,若无相交节点,二者必然同时第二次遇到nullptr,故需要count_A和count_B分别记录p_A和p_B是第几次遇到nullptr,count = 0时为第一次遇到,切换另一个链表遍历,若count = 1则为第二次遇到,此时说明必然无相交节点,直接返回nullptr

142.环形链表Ⅱ
有点懵,后续解决...

2025/02/16

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

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

相关文章

倾斜摄影OSGB瓦块大小重划分

在倾斜摄影数据生产过程中或者使用时,经常会遇到生产的瓦块过大或者过小的问题,如果重新生成一来费时费力,二来有些数据原片都不一定还有,因此很多用户提出能否开发一个osgb瓦块大小重新划分的功能。 现在它来了,2025年的第一个版本更新,我们把这个功能加上了,新…

DeepSeek本地安装部署以及对外提供服务

本地安装部署参考博客:https://blog.csdn.net/weixin_47061482/article/details/145577119,这里就不赘述了。 下面说一下对外提供deepseek服务。 场景:本地部署了deepseek之后,在公司如何使用服务,又或者说把本地服务提供给其他人使用。 工具:chatbox:一款 AI 客户端应用…

在.net8中使用OpenTelemetry来metric

OpenTelemetry可以说是可观测性里的中流砥柱,自然.net也能很好的与期交互。OpenTelemetry支持了很多语言,C#也在其中,下面的列子就是在一个api项目中,添加对OpenTelemetry的NuGet包的引用,来完成应用的metric的。基本思路是,第一步:在程序中引入OpenTelemetry相关包,并…

PyTorch 学习笔记:二分类神经网络实例

PyTorch 学习笔记:二分类神经网络实例 作者:BohengWebb 以下是菜鸟教程提供的一个二分类经典案例(有改动): import torch import torch.nn as nn import torch.optim as optim import matplotlib.pyplot as pltn_samples = 100 data = torch.randn(n_samples, 2) labels =…

OSGB层级截取

倾斜OSGB数据中,每个瓦块中的OSGB文件实际是一个金字塔层级的组织形式,按照层级进行组织,层级越大,模型越精细,同样的文件大小也越大,对渲染引擎的压力也越大。有些情况下不需要模型那么精细,因此可以通过删除相应层级的OSGB文件达到减少文件大小,降低渲染压力的目的。…

C#12:内联数组

之前,想把一个对象当集合使用,需要给这个类型构建索引器,为了foreach,还需要实现IEnumerable。public struct Season : IEnumerable {readonly string[] _arr;public Season(){_arr = new string[4];}public string this[int index]{get => _arr[index];set => _arr[…

C#12:主构造函数

record:record可以在定义类型时带参,这个参数会转成默认的属性public record PersonRecord(string FirstName, string LastName) {public string Name => $"{FirstName} {LastName}"; }在实例化完对象后,是可以直接使用这些属性的,但用record定义的类型,不会有…

.NET 8下的AOT

相比之前,AOT在.NET8的第5个预览版有了进一步的实现,给我的感觉是在一步步落地,虽然离生产还很远,但还是能看到希望的。使用AOT的API项目与传统的Web API项目在模版就作了区分,分别是“asp.net core api”和“asp.net core web api”,命令行创建项目的短名称是api和webap…

用deepseek4j开发私有大模型知识库

DeepSeek R1 凭借其强大的思维链能力在开发者中广受欢迎,但 Spring AI 等主流框架对其支持不足,特别是在思维链内容保留和流式输出方面存在诸多限制。deepseek4j 1.4 版本重磅发布支持向量模型等重要更新。 背景 deepseek4j 提供了一套强大的 API,涵盖了 Reasoner、Function…

简单的tcp客户端协议1.0

先添加包代码部分: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using STTech.BytesIO.Co…

【OpenAISK】:实现自己的问答机器人

前ChatGPT让人惊叹的是,它好像有了真人的思维逻辑,能记住上下文,还能很融洽地和你聊天,并且回答问题让你满意。但如果你问他一些自己身边事,或者公司最新产品的事,ChatGPT的回复就天马行空了。怎么才能让他成为自己的问答机器人呢?下面给出了一个简单的事例,一起看一下…

Windows的MySQL数据库升级(安装器方式)

1、背景描述 原来的 MySQL 在安装时,是最新的稳定版本 5.7.33 。 经过一段时间后,在原来的 MySQL 版本中,发现存在漏洞。 因为 MySQL 的官方补丁,需要 Oracle 的 si 码(Support Identifier),不是免费的。 因此,只好将旧版本(5.7.33)升级到没有漏洞的新版本(5.7.44)…