LeetCode刷题链表

文章目录

  • 链表总结 + 常用技巧
  • 两数相加
    • 题解
    • 代码
  • 两两交换链表中的节点
    • 题解
    • 代码
  • 重排链表
    • 题解
    • 代码
  • 合并k个升序链表
    • 题解
    • 代码
  • K个一组翻转链表
    • 题解
    • 代码

在这里插入图片描述

链表总结 + 常用技巧

  1. 画图 = 直观 + 形象 + 便于理解
  2. 引入虚拟头节点,便于处理边界情况,方便我们对链表进行操作

在这里插入图片描述
3. 大胆去定义变量,不要吝啬空间,可以简单化链表链接
在这里插入图片描述

  1. 快慢双指针,判断环,找链表中环的入口,找链表中倒数第n个节点
  2. 链表中的常用操作:
    创建一个新节点 new
    尾插
    头插,使用虚拟头节点,例题逆序链表,如下图

在这里插入图片描述

两数相加

题目链接
在这里插入图片描述

题解

1. 在链表中模拟两数相加的过程
2. 注意t的进位,一个链表比另一个链表长的情况,开虚拟头结点,我们模拟相加的时候从低位开始加,这里刚好是从低位开始加的,不需要逆置链表

在这里插入图片描述

代码

class Solution 
{
public:ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {// 记录第一个链表和第二个链表ListNode* cur1 = l1,*cur2 = l2;ListNode* newhead = new ListNode(0);// 哨兵位节点int t = 0;// 记录进位ListNode* pcur = newhead;// 尾指针// cur1,cur2,t都不为空while(cur1 || cur2 || t){// 加上第一个链表if(cur1){t += cur1->val;cur1 = cur1->next;}// 加上第二个链表if(cur2){t += cur2->val;cur2 = cur2->next;}pcur->next = new ListNode(t % 10);pcur = pcur->next;t /= 10;}    // 防止内存泄漏pcur = newhead->next;delete newhead;return pcur;}
};

两两交换链表中的节点

题目链接
在这里插入图片描述

题解

1. 模拟
2. 创建4个变量,一个虚拟节点,最后只需返回虚拟节点的next指针,然后交换两数的指针,让指针移动到下一个要交换的位置
3. 注意数为奇数和偶数的情况,为偶数时cur指针为空,为奇数的时候next指针为空

在这里插入图片描述

代码

class Solution 
{
public:ListNode* swapPairs(ListNode* head) {if(head == nullptr) return nullptr;if(head->next == nullptr) return head;ListNode* newhead = new ListNode(0);ListNode* prev = newhead;ListNode* cur = head;ListNode* next = cur->next;ListNode* nnext = next->next;while(cur && next){// 交换节点prev->next = next; next->next = cur;cur->next = nnext;// 修改指针并且注意顺序prev = cur;cur = nnext;if(cur == nullptr) break;next = nnext->next;if(next == nullptr) break;nnext = next->next;}cur = newhead->next;delete newhead;return cur;}
};

重排链表

题目链接
在这里插入图片描述

题解

1. 模拟
2. 先找到链表的中间节点,slow->next为分割点分割两个链表,利用头插法逆置后面的一个链表,最后按顺序链接两个链表

在这里插入图片描述

利用快慢双指针分割链表
在这里插入图片描述
头插法
在这里插入图片描述

代码

class Solution 
{
public:void reorderList(ListNode* head) {// 快慢双指针找链表的中间节点// 0个1个2个节点不需要重排if(head == nullptr || head->next == nullptr || head->next->next == nullptr) return;ListNode* slow = head;ListNode* fast = head;// 奇数个节点和偶数个节点while(fast && fast->next){slow = slow->next;fast = fast->next->next;}// 把slow->next做为分割链表的节点// 方便分割链表// 否则slow做为分割节点,还需要加入虚拟节点,也还是是slow->next// 头插法进行分割链表// 逆置第二个链表ListNode* head2 = new ListNode(0);ListNode* cur = slow->next;slow->next = nullptr;while(cur){ListNode* next = cur->next;cur->next = head2->next;head2->next = cur;cur = next;}// 尾插法连接两个链表ListNode* newhead = new ListNode(0);ListNode* prev = newhead;ListNode* cur1 = head,*cur2 = head2->next;// 第一个链表比第二个链表长while(cur1){prev->next = cur1;cur1 = cur1->next;prev = prev->next;if(cur2){prev->next = cur2;cur2 = cur2->next;prev = prev->next;}}delete head2;delete newhead;}
};

合并k个升序链表

题目链接
在这里插入图片描述

题解

在这里插入图片描述

代码

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& x : lists){if(x) heap.push(x);}ListNode* newhead = new ListNode(0);ListNode* cur = newhead;while(!heap.empty()){ListNode* t = heap.top();cur->next = t;heap.pop();cur = cur->next;if(t->next) heap.push(t->next); }cur = newhead->next;delete  newhead;return cur;}
};

K个一组翻转链表

题目链接
在这里插入图片描述

题解

1. 注意每次更新一下prev这个指针,prev = tmp
在这里插入图片描述

代码

class Solution 
{
public:ListNode* reverseKGroup(ListNode* head, int k) {// 先算出有多少个节点int count = 0;ListNode* cur = head;while(cur){count++;cur = cur->next;}// 头插法int p = count / k;ListNode* newhead = new ListNode(0);ListNode* prev = newhead;cur = head;for(int i = 0;i < p;i++){ListNode* tmp = cur; for(int j = 0;j < k;j++){ListNode* next = cur->next;cur->next = prev->next;prev->next = cur;cur = next;}prev = tmp;}prev->next = cur;prev = newhead->next;delete newhead;return prev;}
};

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

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

相关文章

ESP32S3 多固件烧录方法、合并多个固件为单一固件方法

ESP32S3 多固件烧录方法、合并多个固件为单一固件方法 文章目录 ESP32S3 多固件烧录方法、合并多个固件为单一固件方法前言1、前期准备工作2、多固件烧录方法3、单固件烧录方法总结 前言 使用正点原子的ESP32S3 BOX开发板独立烧录编译生成的xxx.bin固件无法正常运行起来&#…

Webug4.0靶场通关笔记10- 第14关链接注入

目录 第14关 链接注入 1.打开靶场 2.源码分析 3.渗透实战 &#xff08;1&#xff09;方法1&#xff1a;跳转外部网页 &#xff08;2&#xff09;方法2&#xff1a;获取cookie 4.漏洞防御 本文通过《webug靶场第14关 链接注入》来进行渗透实战。 第14关 链接注入 链接注…

SpringBoot的汽车商城后台管理系统源码开发实现

概述 汽车商城后台管理系统专为汽车4S店和经销商设计&#xff0c;提供全面的汽车管理系统解决方案。 主要内容 1. 核心功能模块 系统提供以下主要功能&#xff1a; ​​销售管理​​&#xff1a;记录销售信息&#xff0c;跟踪交易进度​​客户管理​​&#xff1a;维护客户…

VBA代码解决方案第二十四讲:EXCEL中,如何删除重复数据行

《VBA代码解决方案》(版权10028096)这套教程是我最早推出的教程&#xff0c;目前已经是第三版修订了。这套教程定位于入门后的提高&#xff0c;在学习这套教程过程中&#xff0c;侧重点是要理解及掌握我的“积木编程”思想。要灵活运用教程中的实例像搭积木一样把自己喜欢的代码…

日本IT行业|salesforce开发语言占据的地位

在日本的IT行业中&#xff0c;Salesforce 开发语言处于一个较为专业但稳步增长的细分领域&#xff0c;并不是主流开发语言&#xff08;如 Java、Python、PHP&#xff09;&#xff0c;但其在某些行业和场景中地位越来越重要。 本篇以下是详细分析&#xff1a; Salesforce开发语言…

前端开发,文件在镜像服务器上不存在问题:Downloading binary from...Cannot download...

问题与处理策略 问题描述 在 Vue 项目中&#xff0c;执行 npm i 下载依赖时&#xff0c;报如下错误 Downloading binary from https://npm.taobao.org/mirrors/node-sass//v4.14.1/win32-x64-72_binding.node Cannot download "https://npm.taobao.org/mirrors/node-sa…

基于Vue2 + Element 实现任务列表管理功能的详细教程

前言&#xff1a;本文介绍的是如何从0开始搭建Vue2项目到1实现对任务添加、删除和筛选的功能&#xff0c;&#x1f517; 相关链接Vue 入门(安装与应用超详细教程) ❤ 【作者主页—&#x1f4da;阅读更多优质文章、获取更多优质源码】 目录 一 . 项目搭建 1.1 安装node.js 1.…

【PostgreSQL数据分析实战:从数据清洗到可视化全流程】1.4 数据库与表的基本操作(DDL/DML语句)

&#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 文章大纲 1.4 数据库与表的基本操作&#xff08;DDL/DML语句&#xff09;1.4.1 数据库生命周期管理&#xff08;DDL核心&#xff09;1.4.1.1 创建数据库&#xff08;CREATE DATABASE&…

Fabrice Bellard(个人网站:‌bellard.org‌)介绍

Fabrice Bellard 是法国人&#xff0c;国际著名程序员。1972年生于法国Grenoble&#xff0c;大学就读于巴黎高等综合理工学院&#xff0c;后在国立巴黎高等电信学院攻读。 Fabrice Bellard&#xff08;个人网站&#xff1a;‌bellard.org‌&#xff09;是计算机领域最具影响力…

USB布局布线

1USB简介 USB是通用串行总线的英文缩写&#xff0c;是连接外部装置的一个串口总线标准&#xff0c;也是一种输入输出接口的技术规范&#xff0c;被广泛地应用于个人电脑和移动设备等信息通迅产品&#xff0c;并扩展到摄影器材&#xff0c;数字电视&#xff08;机顶盒&#xff0…

【数据结构】线性表--链表

【数据结构】线性表--链表 一.前情回顾二.链表的概念三.链表的实现1.链表结点的结构&#xff1a;2.申请新结点函数&#xff1a;3.尾插函数&#xff1a;4.头插函数&#xff1a;5.尾删函数&#xff1a;6.头删函数&#xff1a;7.在指定结点之前插入&#xff1a;8.在指定结点之后插…

Mybatis-plus代码生成器的创建使用与详细解释

Mybatis-plus代码生成器的创建使用与详细解释 一、代码生成器概述 1. 定义(什么是代码生成器) 在软件开发过程中&#xff0c;存在大量重复性的代码编写工作&#xff0c;例如实体类、Mapper 接口、Service 接口及实现类等。代码生成器就是为了解决这类问题而诞生的工具。MyBa…

drawDB:打造高效数据库设计流程

drawDB&#xff1a;打造高效数据库设计流程 drawDB 简介资源链接 核心功能详解1. 直观的实体关系图设计2. SQL 脚本生成3. SQL 导入功能4. 本地化存储与分享功能5. 自定义主题与外观 安装和使用教程本地开发环境搭建构建生产版本Docker 部署基本使用方法 应用场景和实际价值适用…

基于 ESP32 和 GC9D01 0.71寸TFT屏幕的逼真眼睛与写轮眼动态显示

近期&#xff0c;我利用 ESP32 和 GC9D01 0.71’TFT 进行了一次有趣的显示项目开发&#xff0c;成功实现了在该小尺寸屏幕上绘制逼真眼睛和写轮眼的效果。 硬件准备 主控板 &#xff1a;ESP32&#xff0c;具备强大的处理能力和丰富的接口资源&#xff0c;能够高效地处理图像数…

LeetCode58_最后一个单词的长度

LeetCode58_最后一个单词的长度 标签&#xff1a;#字符串Ⅰ. 题目Ⅱ. 示例 0. 个人方法 标签&#xff1a;#字符串 Ⅰ. 题目 给你一个字符串 s&#xff0c;由若干单词组成&#xff0c;单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。 单词 是指仅由字母组成、…

论文阅读:MAXIM Multi-Axis MLP for Image Processing

这是 2022 CVPR 上的一篇文章&#xff0c;介绍了用 MLP 做 low-level 图像处理的工作 Abstract 近年来&#xff0c;Transformer 和多层感知机&#xff08;MLP&#xff09;模型的发展为计算机视觉任务提供了新的网络架构设计。尽管这些模型在图像识别等许多视觉任务中已被证明…

PostgreSQL初试

文章目录 1 PostgreSQL 简介2 PostgreSQL 与 MySQL 的区别3 PostgreSQL 的安装1_Linux部署2_容器化部署 4 PostgreSQL的配置1_远程连接配置2_配置数据库的日志3_设置数据库密码 5 PostgreSQL 基本操作1_用户操作2_权限操作3_创建一个自己的用户4_差异补充 6 安装图形化界面1_使…

Fortran语言,do-end do循环,相互包含测试,自动性能优化

1&#xff09;上代码 !$omp parallel private(n, j, dx, dy, dz, r, a)do n 1, nsteps!$omp dodo i 0, nparticles - 1x_tmp(i) x(i) vx(i) * dty_tmp(i) y(i) vy(i) * dtz_tmp(i) z(i) vz(i) * dtdo j 0, nparticles - 1dx x(j) - x(i)dy y(j) - y(i)dz z(j) - z(…

Cona编译问题

问题描述 Clion 使用conan插件配置了C工程&#xff0c;然后想通过命令行进行编译执行。 出现以下错误 CMake Error at /usr/local/Cellar/cmake/3.30.1/share/cmake/Modules/CMakeDetermineSystem.cmake:152 (message):Could not find toolchain file: conan_toolchain.cmake…

Qt实现 hello world + 内存泄漏(5)

文章目录 实现hello world的两种方式通过图形化的方式通过纯代码的方式1. 新老头文件的说明2.堆或栈上创建对象的选择3.QString的说明 内存泄漏问题 实现hello world的两种方式 通过图形化的方式 通过图形化的方式&#xff0c;在界面上创建出一个控件&#xff0c;显示出hello …