当前位置: 首页 > news >正文

【刷题13】链表专题

目录

  • 一、两数相加
  • 二、两两交换链表的节点
  • 三、重排链表
  • 四、合并k个升序链表
  • 五、k个一组翻转链表

一、两数相加

题目:
在这里插入图片描述

思路:

  • 注意整数是逆序存储的,结果要按照题目的要求用链表连接起来
  • 遍历l1的cur1,遍历l2的cur2,和一个整数t,用来表示进位(t等于1,要进位;t等于0,不需要进位)
  • 先固定好头节点newhead,所以cur1和cur2指向的val先要运算。为什么要先固定好头节点,因为方便后面尾插
  • 相加的结果为变量tmp,如果>=10,就取后面的数(%10),并且t=1;否则直接用相加后的tmp来构造节点的值,t还是0
  • 进入循环条件,只要cur1、cur2、t任意一个不为空(t不等于0),就能进入循环,有节点,就加节点的值,没节点就用进位
  • 循环中,每次的tmp要刷新为0,cur1不为空,tmp+=cur1->val,cur1往后走;cur2不为空,tmp+=cur2->val,cur2往后走;t等于1,说明有进位,tmp+=1。如果tmp>=10,tmp取后面的数,t = 1;否则还是相加后的tmp,t = 0;
  • 然后构造新节点,val为tmp,尾插
  • 循环后,tail->next 记得置为空(最好),返回newhead

代码:

class Solution {
public:ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {ListNode* cur1 = l1;ListNode* cur2 = l2;int t = 0;// 进位int tmp = cur1->val + cur2->val;cur1 = cur1->next;cur2 = cur2->next;if(tmp >= 10){t = 1;tmp %= 10;}ListNode* newhead = new ListNode(tmp);ListNode* tail = newhead;while(cur1 || cur2 || t){tmp = 0;if(cur1 != nullptr) {tmp += cur1->val;cur1 = cur1->next;}if(cur2 != nullptr) {tmp += cur2->val;cur2 = cur2->next;}if(t) tmp += t;if(tmp >= 10){t = 1;tmp %= 10;} else t = 0;ListNode* newnode = new ListNode(tmp);tail->next = newnode;tail = tail->next;}tail->next = nullptr;return newhead;}
};

二、两两交换链表的节点

题目:
在这里插入图片描述
解法一: 交换值(能过)
思路:

  • 链表为空,返回空
  • 链表只有一个节点,返回该链表
  • 链表大于1个节点:prev指向第一个节点,cur指向第二个节点,循环为cur不为空
  • 进入循环,cur和prev的节点值交换,然后prev指向cur的下一个节点,如果prev不为空,cur指向prev的下一个节点(相当于走了两步);否则直接跳出循环
  • 然后原来的链表

代码:

class Solution {
public:ListNode* swapPairs(ListNode* head) {if(head == nullptr) return nullptr;if(head->next == nullptr) return head;ListNode* cur = head->next;ListNode* prev = head;while(cur){int t = cur->val;cur->val = prev->val;prev->val = t;prev = cur->next;if(prev == nullptr) break;cur = prev->next;}return head;}
};

解法二: 交换节点
思路:

  • 如果为空链表或者链表只有一个节点,直接返回head
  • 定义一个哨兵位头节点,方便后续连接操作
  • 定义4个指针:
    在这里插入图片描述
  • 注意连接顺序和可能为空的情况
  • 让head重新指向修改后的tmp的next,销毁tmp,返回head

代码:

class Solution {
public:ListNode* swapPairs(ListNode* head) {if(head == nullptr || head->next == nullptr) return head;ListNode* tmp = new ListNode(0);tmp->next = head;ListNode* prev = tmp;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) next = cur->next;if(next) nnext = next->next;}head = tmp->next;//delete tmp;return head;}
};

三、重排链表

题目:
在这里插入图片描述
思路:
在这里插入图片描述

  • 找到中间节点,中间节点之后逆序,然后如图先h1插入节点,再h2插入节点
  • 如果链表的节点只有一个,还是原来的链表
  • 找到中间节点——快慢双指针法
  • 链表逆序——头插法
  • 定义newhead为head,先固定第一个节点。h1为中间节点后逆序的链表,h2为head的下一个节点
  • h1不为空,尾插h1的节点;h2不为slow(因为slow指向的是中间节点的位置)尾插h2的节点
  • 循环结束,tail->next等于空,head=newhead,即还原head

代码:

class Solution {
public:void reorderList(ListNode* head) {if(head->next == nullptr) head = head;else {ListNode* slow = head;ListNode* fast = head;while(fast && fast->next){slow = slow->next;fast = fast->next->next;} ListNode* mid = slow;ListNode* h1 = nullptr;while(mid){ListNode* next = mid->next;mid->next = h1;h1 = mid;mid = next;}ListNode* h2 = head->next;ListNode* newhead = head;ListNode* tail = newhead;while(h1){tail->next = h1;tail = tail->next;h1 = h1->next;if(h2 != slow){tail->next = h2;tail = tail->next;h2 = h2->next;}}tail->next = nullptr;head = newhead;}}
};

四、合并k个升序链表

题目:
在这里插入图片描述
思路:
小堆,所有的链表的节点放入小堆,然后取顶部依次尾插(注意:要考虑链表的某个节点可能为空的情况)

代码:

class Solution {
public:ListNode* mergeKLists(vector<ListNode*>& lists) {priority_queue<int, vector<int>, greater<int>> pq;// 小堆ListNode* newhead =nullptr;ListNode* tail= nullptr;// k * n=500(节点数)for(auto &l : lists){if(l){ListNode* cur = l;while(cur){pq.push(cur->val);cur = cur->next;}}}// log(n*k) => log(k)while(!pq.empty()){int t = pq.top();ListNode* newnode = new ListNode(t);if(tail == nullptr){tail = newhead = newnode;}else {tail->next = newnode;tail = tail->next;}pq.pop();}return newhead;}
};

五、k个一组翻转链表

题目:
在这里插入图片描述

思路:

  • 两层循环,外面是翻转的组的个数,里面的一组的节点数(头插法)
  • 先用哨兵位节点newhead固定,然后接下来每组的节点翻转后尾插到新的节点后面(刚开始是哨兵位节点,后面是上一组第一个头插的节点)
  • 最后返回newhead的下一个节点,记得循环哨兵位节点

代码:

class Solution {
public:ListNode* reverseKGroup(ListNode* head, int k) {ListNode* newhead = new ListNode(0);// 哨兵位节点先固定,方便后面连接ListNode* tail = newhead;// 方便找尾int n = 0;// 节点数ListNode* cur = head;// 遍历链表while(cur){n++;cur = cur->next;}n /= k;// 翻转的组的个数int y = k;// 为了还原原来的k值// cur = head;// 回到第一个节点while(n--)// 循环组数{ListNode* tmphead = nullptr;// 临时的头指针// 头插法while(k--)// 循环要翻转(头插)的节点数{ListNode* next = cur->next;cur->next = tmphead;tmphead = cur;cur = next;}k = y;// 还原ktail->next = tmphead;// 连接翻转的后一组子链表// 找到尾节点,方便下次尾插新的一组子链表while(tail->next){tail = tail->next;}}tail->next = cur;// 尾插剩余的节点while(tail->next){tail = tail->next;}tail->next = nullptr;// ListNode* ret = newhead->next;// 要返回的链表delete newhead;//return ret;}
};

相关文章:

【刷题13】链表专题

目录 一、两数相加二、两两交换链表的节点三、重排链表四、合并k个升序链表五、k个一组翻转链表 一、两数相加 题目&#xff1a; 思路&#xff1a; 注意整数是逆序存储的&#xff0c;结果要按照题目的要求用链表连接起来遍历l1的cur1&#xff0c;遍历l2的cur2&#xff0c;和…...

Python Turtle模块详解与使用教程

Python Turtle模块详解与使用教程 引言 Python是一种广泛使用的编程语言&#xff0c;其简洁易读的语法使得它成为初学者学习编程的理想选择。而Turtle模块则是Python标准库中一个非常有趣且实用的图形绘制工具&#xff0c;特别适合用于教育和学习编程的基础知识。通过Turtle模…...

【PTA】4-2 树的同构【数据结构】

给定两棵树 T1​ 和 T2​。如果 T1​ 可以通过若干次左右孩子互换就变成 T2​&#xff0c;则我们称两棵树是“同构”的。例如图1给出的两棵树就是同构的&#xff0c;因为我们把其中一棵树的结点A、B、G的左右孩子互换后&#xff0c;就得到另外一棵树。而图2就不是同构的。 图一…...

Node.js——fs模块-同步与异步

本文的分享到此结束&#xff0c;欢迎大家评论区一同讨论学习&#xff0c;下一篇继续分享Node.js的fs模块文件追加写入的学习。...

Java基于微信小程序的私家车位共享系统(附源码,文档)

博主介绍&#xff1a;✌stormjun、8年大厂程序员经历。全网粉丝15w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&…...

vscode 创建 vue 项目时,配置文件为什么收缩到一起展示了?

一、前言 今天用 vue 官方脚手架创建工程&#xff0c;然后通过 vscode 打开项目发现&#xff0c;配置文件都被收缩在一起了。就像下面这样 这有点反直觉&#xff0c;他们应该是在同一层级下的&#xff0c;怎么会这样&#xff0c;有点好奇&#xff0c;但是打开资源管理查看&…...

PySpark任务提交

一般情况下&#xff0c;spark任务是用scala开发的&#xff0c;但是对于一些偏业务人员&#xff0c;或者是基于上手的来说python的API确实降低了开发前置条件的难度&#xff0c;首当其冲的就是能跳过Java和Scala需要的知识储备&#xff0c;但是在提交任务到集群的时候就很麻烦了…...

【果蔬购物商城管理与推荐系统】Python+Django网页界面+协同过滤推荐算法+管理系统网站

一、介绍 果蔬购物管理与推荐系统。本系统以Python作为主要开发语言&#xff0c;前端通过HTML、CSS、BootStrap等框架搭建界面&#xff0c;后端使用Django框架作为逻辑处理&#xff0c;通过Ajax实现前后端的数据通信。并基于用户对商品的评分信息&#xff0c;采用协同过滤推荐…...

【大模型】海外生成式AI赛道的关键玩家:OpenAI、Anthropic之外还有谁?

引言 在生成式AI快速发展的今天&#xff0c;不同公司在各自领域发挥着独特作用。本文将从基础模型研发、开发工具框架、垂直领域应用三个维度&#xff0c;为读者梳理当前生成式AI技术领域的主要参与者&#xff0c;帮助开发者更好地把握技术发展方向。 一、基础模型研发公司 O…...

kubevirt cloud-init配置

https://cloudinit.readthedocs.io/en/latest/reference/examples.html (示例) https://cloudinit.readthedocs.io/en/latest/reference/faq.html (常见问题) https://cloudinit.readthedocs.io/en/latest/howto/debug_user_data.html (检查user_data) https://clo…...

Oracle 大表添加索引的最佳方式

背景&#xff1a; 业务系统中现在经常存在上亿数据的大表&#xff0c;在这样的大表上新建索引&#xff0c;是一个较为耗时的操作&#xff0c;特别是在生产环境的系统中&#xff0c;添加不当&#xff0c;有可能造成业务表锁表&#xff0c;业务表长时间的停服势必会影响正常业务…...

速度了解云原生后端!!!

云原生后端是指基于云计算技术和理念构建的后端系统架构&#xff0c;旨在充分利用云计算的优势&#xff0c;实现快速部署、弹性扩展、高可用性和高效运维。以下是云原生后端的一些关键特点和技术&#xff1a; 容器化 容器化是云原生架构的核心之一&#xff0c;它使用容器技术&…...

云计算Openstack 虚拟机调度策略

OpenStack的虚拟机调度策略是一个复杂而灵活的系统&#xff0c;它主要由两种调度器实现&#xff1a;FilterScheduler&#xff08;过滤调度器&#xff09;和ChanceScheduler&#xff08;随机调度器&#xff09;。以下是对这两种调度器及其调度策略的详细解释&#xff1a; 一、F…...

在 macOS 上添加 hosts 文件解析的步骤

步骤 1: 打开 hosts 文件 打开终端&#xff1a; 你可以通过 Spotlight 搜索&#xff08;按 Cmd Space 并输入 Terminal&#xff09;来打开终端。 使用文本编辑器打开 hosts 文件&#xff1a; 在终端中输入以下命令&#xff0c;使用 nano 文本编辑器打开 hosts 文件&#xff1a…...

RHCE【防火墙】

目录 一、防火墙简介 二、iptables 实验一&#xff1a;搭建web服务&#xff0c;设置任何人能够通过80端口访问。 实验二&#xff1a;禁止所有人ssh远程登录该服务器 实验三&#xff1a;禁止某个主机地址ssh远程登录该服务器&#xff0c;允许该主机访问服务器的web服务。服…...

基于springboot的招聘系统的设计与实现

摘 要 随着互联网时代的发展&#xff0c;传统的线下管理技术已无法高效、便捷的管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&#xff0c;国家在工作岗位要求不断提高的前提下&#xff0c;招聘系统建设也逐渐进入了信息化时代。…...

长度最小的子数组(滑动窗口)

给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 子数组 [numsl, numsl1, ..., numsr-1, numsr] &#xff0c;并返回其长度。如果不存在符合条件的子数组&#xff0c;返回 0 。 示例 1&#xff1a; 输入&#xf…...

构建灵活、高效的HTTP/1.1应用:探索h11库

文章目录 构建灵活、高效的HTTP/1.1应用&#xff1a;探索h11库背景这个库是什么&#xff1f;如何安装这个库&#xff1f;库函数使用方法使用场景常见的Bug及解决方案总结 构建灵活、高效的HTTP/1.1应用&#xff1a;探索h11库 背景 在现代网络应用中&#xff0c;HTTP协议是基础…...

大学英语救星!GPT助你完美解答完型填空和阅读理解

文章目录 零、前言一、再来十篇完型填空和阅读理解操作指导拍照&#xff1a;完型填空拍照&#xff1a;阅读理解 二、感受 零、前言 学习过程中&#xff0c;总是会遇到一些问题&#xff0c;但不好意思总是去麻烦问老师或同学 gpt可以帮社恐的你&#xff0c;解决学习问题&#…...

【linux】centos编译安装openssl1.1.1

文章目录 背景用途编译安装openssl1.1.1d测试centos的python2 ssl模块是否正常pyenv编译python3.10需要配置环境变量(必须)编译python前记得安装依赖 背景 首先&#xff0c; centos7 通过yum安装的openssl-devel包是1.0.2k的&#xff0c;这玩意儿太老了。我们选择从源码安装op…...

【力扣数据库知识手册笔记】索引

索引 索引的优缺点 优点1. 通过创建唯一性索引&#xff0c;可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度&#xff08;创建索引的主要原因&#xff09;。3. 可以加速表和表之间的连接&#xff0c;实现数据的参考完整性。4. 可以在查询过程中&#xff0c;…...

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台&#xff08;Launchpad&#xff09;多出来了&#xff1a;Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显&#xff0c;都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

微信小程序 - 手机震动

一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注&#xff1a;文档 https://developers.weixin.qq…...

将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?

Otsu 是一种自动阈值化方法&#xff0c;用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理&#xff0c;能够自动确定一个阈值&#xff0c;将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...

Nginx server_name 配置说明

Nginx 是一个高性能的反向代理和负载均衡服务器&#xff0c;其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机&#xff08;Virtual Host&#xff09;。 1. 简介 Nginx 使用 server_name 指令来确定…...

Java 加密常用的各种算法及其选择

在数字化时代&#xff0c;数据安全至关重要&#xff0c;Java 作为广泛应用的编程语言&#xff0c;提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景&#xff0c;有助于开发者在不同的业务需求中做出正确的选择。​ 一、对称加密算法…...

PL0语法,分析器实现!

简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...

【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)

要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况&#xff0c;可以通过以下几种方式模拟或触发&#xff1a; 1. 增加CPU负载 运行大量计算密集型任务&#xff0c;例如&#xff1a; 使用多线程循环执行复杂计算&#xff08;如数学运算、加密解密等&#xff09;。运行图…...

Caliper 配置文件解析:config.yaml

Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心

当仓库学会“思考”&#xff0c;物流的终极形态正在诞生 想象这样的场景&#xff1a; 凌晨3点&#xff0c;某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径&#xff1b;AI视觉系统在0.1秒内扫描包裹信息&#xff1b;数字孪生平台正模拟次日峰值流量压力…...