链表类型题目

文章目录

  • 简介
  • 链表的常用技巧
  • 两数相加
    • 原理
    • 代码
    • 代码||
  • 两两交换链表中的节点
    • 代码
    • 原理
  • 重排链表(重要)
    • 原理
    • 代码
  • 合并 K 个升序链表
    • 代码
    • 递归代码
  • K 个一组翻转链表
    • 原理
    • 代码

简介

大家好,这里是jiantaoyab,这篇文章给大家带来的是链表相关的题目练习和解析,希望大家能相互讨论进步


链表的常用技巧

  • 画图

画图能更加清晰,方便我们去理解

  • 引入虚拟的头结点

创建新的头结点指向原来的链表,方便处理边界情况

  • 多定义一个变量

多定义一个next就不用考虑先链接谁的问题

  • 快慢双指针
  1. 判断链表中是否有环
  2. 找环的入口
  3. 找链表倒数第n个节点
  • 链表逆序用头插

两数相加

https://leetcode.cn/problems/add-two-numbers/

https://leetcode.cn/problems/lMSNwu/ 两数相加||

原理

在这里插入图片描述

代码

class Solution {
public:ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {ListNode* new_head = new ListNode(0); //创建哨兵位头结点ListNode* tail = new_head;int x = 0;//记录进位ListNode* cur1 = l1, *cur2 = l2;while(cur1 || cur2 || x){if(cur1){x += cur1->val;cur1 = cur1->next;}if(cur2){x += cur2->val;cur2= cur2->next;}tail->next = new ListNode(x % 10);tail = tail->next;x /= 10;}tail =  new_head->next;delete new_head;return tail;}
};

代码||

class Solution {
public:ListNode* ReserveList(ListNode* head) {ListNode * head= nullptr;ListNode * curr = head;while(curr) {ListNode* next = curr->next;curr->next = prev;prev = curr;curr = next;}return prev;}ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {ListNode* new_head = new ListNode(0); //创建哨兵位头结点ListNode* tail = new_head;int x = 0;//记录进位l1 = ReserveList(l1);l2 = ReserveList(l2);ListNode* cur1 = l1, *cur2 = l2;while(cur1 || cur2 || x){if(cur1){x += cur1->val;cur1 = cur1->next;}if(cur2){x += cur2->val;cur2= cur2->next;}tail->next = new ListNode(x % 10);tail = tail->next;x /= 10;}tail =  new_head->next;tail = ReserveList(tail);delete new_head;return tail;}
};

两两交换链表中的节点

https://leetcode.cn/problems/swap-nodes-in-pairs/

代码

  • 递归的方式

class Solution {
public:ListNode* swapPairs(ListNode* head) {//终止条件是链表只有一个节点 / 链表中没有节点if(head == nullptr || head->next == nullptr) return head;ListNode* nnext =  swapPairs(head->next->next);ListNode* newhead = head->next;newhead->next = head;head->next = nnext;return newhead;}
};
  • 迭代的方式

原理

在这里插入图片描述

class Solution {
public:ListNode* swapPairs(ListNode* head) {// 0个和1个节点直接返回就好if(head == nullptr || head->next == nullptr)  return head;ListNode* newhead = new ListNode(0); //哨兵位头结点newhead->next = head;ListNode* prev =newhead;ListNode* cur = prev->next;ListNode* next = cur->next;ListNode* nnext = next->next;while(cur != nullptr && next != nullptr){//交换节点prev->next = next;next ->next = cur;cur ->next = nnext;//更新位置prev = cur;cur = nnext;if(cur != nullptr)next = cur->next;if(next != nullptr)nnext = next->next;}cur = newhead->next;delete newhead;return cur;}
};

重排链表(重要)


https://leetcode.cn/problems/LGjMqU/

原理

在这里插入图片描述

代码

class Solution {
public:void reorderList(ListNode* head) {// <=2节点的直接返回if(head == nullptr || head->next == nullptr || head->next->next ==nullptr) return ;//1.找到链表的中间节点ListNode * slow = head, *fast = head;while(fast && fast->next){slow = slow->next;fast = fast->next->next;}//2.将后半部分链表逆置ListNode* new_head = new ListNode(0);ListNode* cur = slow->next;     slow->next = nullptr; //断开链表while(cur){ListNode* next = cur->next;cur->next = new_head->next;new_head->next = cur;cur = next;}//3.合并2个链表ListNode* ret_head = new ListNode(0);ListNode* prev = ret_head;ListNode* cur1 =head, *cur2 = new_head->next;while(cur1){//先放第一个链表prev->next = cur1;cur1 = cur1->next;prev = prev->next;//再放第二个链表if(cur2){prev->next = cur2;cur2 = cur2->next;prev = prev->next;}}delete new_head;delete ret_head;}
};

合并 K 个升序链表

https://leetcode.cn/problems/vvXgSW/

代码

class Solution {struct cmp {bool operator() (const ListNode* l1, const ListNode* l2) {return l1->val > l2->val;}};public:ListNode* mergeKLists(vector<ListNode*>& lists) {//创建小根堆priority_queue<ListNode* ,vector<ListNode*>,cmp> heap;//让所有链表的头结点加入到小根堆中for(auto l :lists){if(l) heap.push(l);}//合并k个有序链表ListNode* new_head = new ListNode(0);ListNode* prev = new_head;//小根堆中还有元素说明还有链表没到nullptrwhile(!heap.empty()){ListNode* min = heap.top();heap.pop();prev->next = min;prev = min;if(min->next) heap.push(min->next);}prev->next = nullptr;prev = new_head->next;delete new_head;return prev;}
};//自己用vs调试的时候,可以加上下面代码调试一步一步看
int main()
{vector<ListNode*> lists = { new ListNode(1, new ListNode(4, new ListNode(5))),new ListNode(1, new ListNode(3, new ListNode(4))),new ListNode(2, new ListNode(6)) };mergeKLists(lists);
}

递归代码

class Solution {
public:ListNode* MergeTowList(ListNode* l ,ListNode* r){if(l == nullptr) return r;if(r == nullptr) return l;ListNode new_head ;new_head.next = nullptr;ListNode* cur1 = l, *cur2 = r, *prev = &new_head ;while(cur1 && cur2){if(cur1->val >= cur2->val){prev = prev->next = cur2;cur2 = cur2->next;}else{prev = prev->next = cur1;cur1 = cur1->next;}}if(cur1) prev->next =cur1;if(cur2) prev->next =cur2;return new_head.next;}ListNode* Merge(vector<ListNode*>& lists, int left, int right) {if(left > right) return nullptr;if(left == right) return lists[left];int mid = (left + right) >> 1;ListNode* l = Merge(lists, left, mid); ListNode* r = Merge(lists, mid + 1, right); //合并2个有序链表return MergeTowList(l,r);}
public:ListNode* mergeKLists(vector<ListNode*>& lists) {      return Merge(lists, 0, lists.size() - 1);}
};

K 个一组翻转链表

原理

在这里插入图片描述

代码

class Solution {
public:ListNode* reverseKGroup(ListNode* head, int k) {int N = 0;ListNode * p = head;while(p){p = p->next;N++;}N /= k; //划分N组ListNode* new_head =  new ListNode(0);ListNode* prev = new_head;ListNode* cur = head;for(int i = 0; i < N; i++){ListNode *first = cur;for(int j = 0; j < k; j++){            ListNode* next = cur->next;cur->next = prev->next;prev->next = cur;cur = next;}prev = first;}//把不需要翻转的接上prev->next = cur;cur = new_head->next;delete new_head;return cur;}
};

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

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

相关文章

[线代]自用大纲

部分内容整理自张宇和网络 序 题型分布&#xff1a; 题型单题分值题目数量总分值选择题5315填空题515解答题12112 *一道大题可能用到六部分所有知识 矩阵 性质 k k k倍和乘积行列式 ∣ k A ∣ k n ∣ A ∣ |kA|k^n|A| ∣kA∣kn∣A∣ ∣ A B ∣ ≠ ∣ A ∣ ∣ B ∣ |AB|≠…

如何解决微服务的数据一致性分发问题?

介绍 系统架构微服务化以后,根据微服务独立数据源的思想,每个微服务一般具有各自独立的数据源,但是不同微服务之间难免需要通过数据分发来共享一些数据,这个就是微服务的数据分发问题。Netflix/Airbnb等一线互联网公司的实践[参考附录1/2/3]表明,数据一致性分发能力,是构…

【 10X summary report】怎么看?详细解读笔记

报告内容 在开始正式的分析之前&#xff0c;需要查看在对齐和计数过程中生成的任何总结统计信息。下图是由Cell Ranger工具创建的10X总结报告&#xff0c;在从10X scRNA-seq实验生成计数矩阵时会生成。 The left half of the report describes sequencing and mapping statist…

C++之stack

1、stack简介 stack是实现的一个先进后出&#xff0c;后进先出的容器。它只有一个出口&#xff0c;只能操作最顶端元素。 2、stack库函数 &#xff08;1&#xff09;push() //向栈压入一个元素 &#xff08;2&#xff09;pop() //移除栈顶元素 &#xff08;3…

基于springboot+vue的中国陕西民俗网

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

nginx,php-fpm

一&#xff0c;Nginx是异步非阻塞多进程&#xff0c;io多路复用 1、master进程&#xff1a;管理进程 master进程主要用来管理worker进程&#xff0c;具体包括如下4个主要功能&#xff1a; &#xff08;1&#xff09;接收来自外界的信号。 &#xff08;2&#xff09;向各worker进…

SAP PP学习笔记04 - BOM2 -通过Serial来做简单的BOM变式配置,副明细,BOM状态,BOM明细状态,项目种类,递归BOM

本章继续讲BOM。 本章讲通过Serial来做简单的BOM变式配置。还讲了BOM的相关概念&#xff1a;副明细&#xff0c;BOM状态&#xff0c;BOM明细状态&#xff0c;项目种类&#xff0c;递归BOM 等。 1&#xff0c;通过Serial&#xff08;序列号&#xff09;来做简单的 VC&#xff0…

Some collections -- 2024.3

一、TensorFlow Android (dataset: Mnist) We used TensorFlow to define and train our machine learning model, which can recognize handwritten numbers, called a number classifier model in machine learning terminology. We transform the trained TensorFlow mod…

2024.03.01作业

1. 基于UDP的TFTP文件传输 #include "test.h"#define SER_IP "192.168.1.104" #define SER_PORT 69 #define IP "192.168.191.128" #define PORT 9999enum mode {TFTP_READ 1,TFTP_WRITE 2,TFTP_DATA 3,TFTP_ACK 4,TFTP_ERR 5 };void get_…

高维中介数据:基于交替方向乘子法(ADMM)的高维度单模态中介模型的参数估计(入门+实操)

全文摘要 用于高维度单模态中介模型的参数估计&#xff0c;采用交替方向乘子法&#xff08;ADMM&#xff09;进行计算。该包提供了确切独立筛选&#xff08;SIS&#xff09;功能来提高中介效应的敏感性和特异性&#xff0c;并支持Lasso、弹性网络、路径Lasso和网络约束惩罚等不…

npm 镜像源切换与设置

项目背景 依赖安装中断或响应特别慢。 可以看到当前所用的镜像是 https://registry.npmjs.org 。 切换淘宝镜像之后总算能够安装下来 命令行模式 查看当前镜像源 # 查看当前镜像源 npm config get registry 可以看到默认情况下是官方默认全局镜像 https://registry.npmjs.o…

竞争加剧下,登顶后的瑞幸该做什么?

瑞幸咖啡仅用短短18个月时间从品牌创立到纳斯达克上市&#xff0c;刷新全球最快上市记录。2020年因交易造假事件被勒令退市股价暴跌80%&#xff0c;有人说这个创造了赴美IPO奇迹的“巨婴”将是下一个倒下的ofo。2023年瑞幸咖啡以逆势超速增长领跑咖啡赛道有力回应了市场的质疑&…

Java多线程实现发布和订阅

目录 简介 步骤 1: 定义消息类 步骤 2: 创建发布者 步骤 3: 创建订阅者 步骤 4: 实现发布-订阅模型 前言-与正文无关 生活远不止眼前的苦劳与奔波&#xff0c;它还充满了无数值得我们去体验和珍惜的美好事物。在这个快节奏的世界中&#xff0c;我们往往容易陷入工作的漩涡…

棋牌室计时计费管理系统的灯控器连接教程

棋牌室计时计费管理系统的灯控器连接教程 一、前言 以下教程以 佳易王棋牌室计时计费管理系统软件V18.0为例说明 软件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 如上图&#xff0c;计时计费软件在开始计时的时候&#xff0c;点击 开始计时 如果连接了…

YOLOv9独家改进|动态蛇形卷积Dynamic Snake Convolution与空间和通道重建卷积SCConv与RepNCSPELAN4融合

专栏介绍&#xff1a;YOLOv9改进系列 | 包含深度学习最新创新&#xff0c;主力高效涨点&#xff01;&#xff01;&#xff01; 一、改进点介绍 Dynamic Snake Convolution是一种针对细长微弱的局部结构特征与复杂多变的全局形态特征设计的卷积模块。 SCConv是一种即插即用的空间…

华为OD机试真题C卷-篇6

100分值题 宽度最小的子矩阵部门人力分配电脑病毒感染会议室占用时间段 宽度最小的子矩阵 给定一个n行 * m列的矩阵&#xff1b;给定一个k个整数的数组k_list&#xff1b;在n*m的矩阵中找一个宽度最小的子矩阵&#xff0c;该子矩阵包含k_list中所有的整数&#xff1b; 输入描述…

项目管理:高效推动项目成功的关键

项目管理&#xff1a;高效推动项目成功的关键 在当今竞争激烈的商业环境中&#xff0c;项目管理已成为企业实现目标和取得成功的关键因素。有效的项目管理不仅能够确保项目按时完成&#xff0c;还能在预算范围内达到预期的质量标准。本文将探讨项目管理的重要性、关键环节以及…

Maven安装并配置本地仓库

一、安装Maven 1.下载链接 Maven官网下载链接 Binary是可执行版本&#xff0c;已经编译好可以直接使用。 Source是源代码版本&#xff0c;需要自己编译成可执行软件才可使用。 tar.gz和zip两种压缩格式,其实这两个压缩文件里面包含的内容是同样的,只是压缩格式不同 tar.gz格…

Stable Video文本生成视频公测地址——Scaling Latent Video Diffusion Models to Large Datasets

近期&#xff0c;Stability AI发布了首个开放视频模型——"Stable Video"&#xff0c;该创新工具能够将文本和图像输入转化为生动的场景&#xff0c;将概念转换成动态影像&#xff0c;生成出电影级别的作品&#xff0c;旨在满足广泛的视频应用需求&#xff0c;包括媒…

STM32 DMA入门指导

什么是DMA DMA&#xff0c;全称直接存储器访问&#xff08;Direct Memory Access&#xff09;&#xff0c;是一种允许硬件子系统直接读写系统内存的技术&#xff0c;无需中央处理单元&#xff08;CPU&#xff09;的介入。下面是DMA的工作原理概述&#xff1a; 数据传输触发&am…