算法9--链表

链表

    • 原理
    • 经典例题
    • [2. 两数相加](https://leetcode.cn/problems/add-two-numbers/description/)
    • [24. 两两交换链表中的节点](https://leetcode.cn/problems/swap-nodes-in-pairs/)
    • [143. 重排链表](https://leetcode.cn/problems/reorder-list/description/)
    • [23. 合并 K 个升序链表](https://leetcode.cn/problems/merge-k-sorted-lists/description/)
    • [25. K 个一组翻转链表](https://leetcode.cn/problems/reverse-nodes-in-k-group/description/)

原理

链表相关的题目就是根据题意堆链表进行增删查改,技巧:

  1. 我们可以为链表添加一个表头,以方便我们处理边界细节问题。
  2. 如果想要逆序某个链表,只需要遍历该链表进行一次头插即可。
  3. 找链表的中间节点只需要一次快慢指针遍历即可。

经典例题

2. 两数相加

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。

struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2)
{struct ListNode*ret=NULL;struct ListNode*cur=NULL;int add=0;while(l1&&l2){int sum=l1->val+l2->val;if(!ret){ret=(struct ListNode*)malloc(sizeof(struct ListNode));cur=ret;}else{cur->next=(struct ListNode*)malloc(sizeof(struct ListNode));cur=cur->next;}cur->val=(sum+add)%10;add=(sum+add)/10;cur->next=NULL;l1=l1->next;l2=l2->next;}while(l1){cur->next=(struct ListNode*)malloc(sizeof(struct ListNode));cur=cur->next;cur->next=NULL;cur->val=(add+l1->val)%10;add=(add+l1->val)/10;l1=l1->next;}while(l2){cur->next=(struct ListNode*)malloc(sizeof(struct ListNode));cur=cur->next;cur->next=NULL;cur->val=(add+l2->val)%10;add=(add+l2->val)/10;l2=l2->next;}while(add){cur->next=(struct ListNode*)malloc(sizeof(struct ListNode));cur=cur->next;cur->next=NULL;cur->val=add%10;add/=10;}return ret;
}

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(nullptr==head||nullptr==head->next){return head;}ListNode newHead;ListNode* cur1=head;ListNode* cur2=head->next;ListNode* pre=&newHead;while(cur1&&cur2){cur1->next=cur2->next;cur2->next=cur1;pre->next=cur2;pre=cur1;cur1=cur1->next;if(cur1){cur2=cur1->next;}}return newHead.next;}
};

143. 重排链表

给定一个单链表 L 的头节点 head ,单链表 L 表示为:
L0 → L1 → … → Ln - 1 → Ln
请将其重新排列后变为:
L0 → Ln → L1 → Ln - 1 → L2 → Ln - 2 → …
不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

/*** 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:void reorderList(ListNode* head) {if(nullptr==head||nullptr==head->next){return;}ListNode* cur1=head;ListNode* cur2=head->next;while(cur2){cur2=cur2->next;if(nullptr==cur2){break;}cur2=cur2->next;cur1=cur1->next;}ListNode* head1=head;ListNode* head2=cur1->next;cur1->next=nullptr;//反转链表2cur1=head2;cur2=head2->next;ListNode* t=head2;while(cur1&&cur2){ListNode* tmp=cur2->next;cur2->next=cur1;cur1=cur2;head2=cur2;cur2=tmp;}t->next=nullptr;cur1=head1;cur2=head2;while(cur1&&cur2){ListNode* tmp1=cur1->next;ListNode* tmp2=cur2->next;cur1->next=cur2;cur2->next=tmp1;cur1=tmp1;cur2=tmp2;}}
};

23. 合并 K 个升序链表

给你一个链表数组,每个链表都已经按升序排列。
请你将所有链表合并到一个升序链表中,返回合并后的链表。

解法一:逐个合并两个链表
解法二:分治递归
解法三:与合并两个有序链表类似,只不过我们需要一个堆以获取每条链表的头节点中的最小值。

/*** 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* _mergeList(ListNode* list1,ListNode* list2){ListNode t;ListNode* head=&t;head->next=nullptr;ListNode* cur=head;ListNode* cur1=list1;ListNode* cur2=list2;while(cur1&&cur2){if(cur1->val<cur2->val){cur->next=cur1;cur1=cur1->next;cur=cur->next;}else if(cur1->val>cur2->val){cur->next=cur2;cur2=cur2->next;cur=cur->next;}else{cur->next=cur1;cur1=cur1->next;cur=cur->next;cur->next=cur2;cur2=cur2->next;cur=cur->next;}}if(cur1){cur->next=cur1;}if(cur2){cur->next=cur2;}return head->next;}ListNode* mergeKLists(vector<ListNode*>& lists) {if(0==lists.size())    {return nullptr;}if(1==lists.size()){return lists[0];}ListNode* head=lists[0];int i=1;while(i<lists.size()){head=_mergeList(head,lists[i++]);}return head;}
};

25. K 个一组翻转链表

给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表。
k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。
你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。

/*** 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:void reverse(ListNode* head,ListNode* tail){ListNode* pre=head;ListNode* cur=head->next;while(pre!=tail){ListNode* tmp=cur->next;cur->next=pre;pre=cur;cur=tmp;}head->next=nullptr;}ListNode* reverseKGroup(ListNode* head, int k) {ListNode t;ListNode* nhead=&t;nhead->next=head;ListNode* prehead=nhead;ListNode* cur=head;ListNode* thead=head;ListNode* ttail=head;int i=k;while(cur){--i;ttail=cur;cur=cur->next;if(0==i){reverse(thead,ttail);prehead->next=ttail;prehead=thead;thead=cur;prehead->next=thead;i=k;}}return nhead->next;}
};

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

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

相关文章

Postman接口测试:全局变量/接口关联/加密/解密

全局变量和环境变量 全局变量&#xff1a;在postman全局生效的变量&#xff0c;全局唯一 环境变量&#xff1a;在特定环境下生效的变量&#xff0c;本环境内唯一 设置&#xff1a; 全局变量&#xff1a; pm.globals.set("variable_key", "variable_value1&q…

ZZNUOJ(C/C++)基础练习1081——1090(详解版)

目录 1081 : n个数求和 &#xff08;多实例测试&#xff09; C C 1082 : 敲7&#xff08;多实例测试&#xff09; C C 1083 : 数值统计(多实例测试) C C 1084 : 计算两点间的距离&#xff08;多实例测试&#xff09; C C 1085 : 求奇数的乘积&#xff08;多实例测试…

STM32的HAL库开发---高级定时器

一、高级定时器简介 1、STM32F103有两个高级定时器&#xff0c;分别是TIM1和TIM8。 2、主要特性 16位递增、递减、中心对齐计数器(计数值:0~65535)16位预分频器(分频系数:1~65536)可用于触发DAC、ADC在更新事件、触发事件、输入捕获、输出比较时&#xff0c;会产生中断/DMA请…

数据库系统架构与DBMS功能探微:现代信息时代数据管理的关键

欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭&#xff5e; ??? 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua&#xff0c;在这里我会分享我的知识和经验。?? 希望在这里&#xff0c;我们能一起探…

优惠券平台(一):基于责任链模式创建优惠券模板

前景概要 系统的主要实现是优惠券的相关业务&#xff0c;所以对于用户管理的实现我们简单用拦截器在触发接口前创建一个单一用户。 // 用户属于非核心功能&#xff0c;这里先通过模拟的形式代替。后续如果需要后管展示&#xff0c;会重构该代码 UserInfoDTO userInfoDTO new…

搭建集成开发环境PyCharm

1.下载安装Python&#xff08;建议下载并安装3.9.x&#xff09; https://www.python.org/downloads/windows/ 要注意勾选“Add Python 3.9 to PATH”复选框&#xff0c;表示将Python的路径增加到环境变量中 2.安装集成开发环境Pycharm http://www.jetbrains.com/pycharm/…

模板的进阶

非类型模板参数 模板参数分类类型形参与非类型形参 。 类型形参即&#xff1a;出现在模板参数列表中&#xff0c;跟在 class 或者 typename 之类的参数类型名称 。 非类型形参&#xff0c;就是用一个常量作为类 ( 函数 ) 模板的一个参数&#xff0c;在类 ( 函数 ) 模板中可将…

windows安装linux子系统【ubuntu】操作步骤

1.在windows系统中开启【适用于Linux的Windows子系统】 控制面板—程序—程序和功能—启用或关闭Windows功能—勾选适用于Linux的Windows子系统–确定 2.下载安装Linux Ubuntu 22.04.5 LTS系统 Ununtu下载链接 3.安装完Ununtu系统后更新系统 sudo apt update4.进入/usr/l…

【大数据技术】搭建完全分布式高可用大数据集群(Kafka)

搭建完全分布式高可用大数据集群(Kafka) kafka_2.13-3.9.0.tgz注:请在阅读本篇文章前,将以上资源下载下来。 写在前面 本文主要介绍搭建完全分布式高可用集群 Kafka 的详细步骤。 注意: 统一约定将软件安装包存放于虚拟机的/software目录下,软件安装至/opt目录下。 安…

万字详解 MySQL MGR 高可用集群搭建

文章目录 1、MGR 前置介绍 1.1、什么是 MGR1.2、MGR 优点1.3、MGR 缺点1.4、MGR 适用场景 2、MySQL MGR 搭建流程 2.1、环境准备2.2、搭建流程 2.2.1、配置系统环境2.2.2、安装 MySQL2.2.3、配置启动 MySQL2.2.4、修改密码、设置主从同步2.2.5、安装 MGR 插件 3、MySQL MGR 故…

Linux高级IO

文章目录 &#x1f965;IO的基本概念&#x1f347;钓鱼五人组&#x1f348;五种IO模型&#x1f349;高级IO重要概念同步通信 VS 异步通信阻塞 VS 非阻塞 &#x1f34a;其他高级IO&#x1f34b;阻塞IO&#x1f34b;‍&#x1f7e9;非阻塞IO &#x1f965;IO的基本概念 什么是IO…

摄像头模块烟火检测

工作原理 基于图像处理技术&#xff1a;分析视频图像中像素的颜色、纹理、形状等特征。火焰通常具有独特的颜色特征&#xff0c;如红色、橙色等&#xff0c;且边缘呈现不规则形状&#xff0c;还会有闪烁、跳动等动态特征&#xff1b;烟雾则表现为模糊、无固定形状&#xff0c;…

4.3 线性回归的改进-岭回归/4.4分类算法-逻辑回归与二分类/ 4.5 模型保存和加载

4.3.1 带有L2正则化的线性回归-岭回归 岭回归&#xff0c;其实也是一种线性回归&#xff0c;只不过在算法建立回归方程的时候1&#xff0c;加上正则化的限制&#xff0c;从而达到解决过拟合的效果 4.3.1.1 API 4.3.1.2 观察正则化程度的变化&#xff0c;对结果的影响 正则化力…

CSS outline详解:轮廓属性的详细介绍

什么是outline&#xff1f; outline&#xff08;轮廓&#xff09;是CSS中一个有趣的属性&#xff0c;它在元素边框&#xff08;border&#xff09;的外围绘制一条线。与border不同的是&#xff0c;outline不占用空间&#xff0c;不会影响元素的尺寸和位置。这个特性使它在某些…

设计模式.

设计模式 一、介绍二、六大原则1、单一职责原则&#xff08;Single Responsibility Principle, SRP&#xff09;2、开闭原则&#xff08;Open-Closed Principle, OCP&#xff09;3、里氏替换原则&#xff08;Liskov Substitution Principle, LSP&#xff09;4、接口隔离原则&am…

硬件工程师思考笔记02-器件的隐秘角落:磁珠与电阻噪声

目录 引言 一、磁珠&#xff1a;你以为的“噪声克星”&#xff0c;可能是高频杀手 1. 磁珠的阻抗特性与误区 2. 案例&#xff1a;磁珠引发的5G射频误码率飙升 二、电阻&#xff1a;静默的噪声制造者 1. 电阻噪声的两种形态 2. 案例&#xff1a;ADC精度被电阻噪声“偷走” 三、设…

mysql 不是内部或外部命令,也不是可运行的程序或批处理文件

mysql 不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件 前言描述1、&#x1f331;环境变量配置&#xff08;高级系统设置&#xff09;&#xff1a;2、&#x1f331;环境变量配置&#xff08;系统属性&#xff09;&#xff1a;3、&#x1f331;环境变量配置&…

极客说|利用 Azure AI Agent Service 创建自定义 VS Code Chat participant

作者&#xff1a;卢建晖 - 微软高级云技术布道师 「极客说」 是一档专注 AI 时代开发者分享的专栏&#xff0c;我们邀请来自微软以及技术社区专家&#xff0c;带来最前沿的技术干货与实践经验。在这里&#xff0c;您将看到深度教程、最佳实践和创新解决方案。关注「极客说」&a…

在rtthread中,scons构建时,它是怎么知道是从rtconfig.h找宏定义,而不是从其他头文件找?

在rtthread源码中&#xff0c;每一个bsp芯片板级目录下都有一个 SConstruct scons构建脚本的入口&#xff0c; 在这里把rtthread tools/目录下的所有模块都添加到了系统路径中&#xff1a; 在tools下所有模块中&#xff0c;最重要的是building.py模块&#xff0c;在此脚本里面…

Redis基础--常用数据结构的命令及底层编码

零.前置知识 关于时间复杂度,按照以下视角看待. redis整体key的个数 -- O(N)当前key对应的value中的元素个数 -- O(N)当前命令行中key的个数 -- O(1) 一.string 1.1string类型常用命令 1.2string类型内部编码 二.Hash 哈希 2.1hash类型常用命令 2.2hash类型内部编码 2.3ha…