【刷题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个一组翻转链表 一、两数相加 题目: 思路: 注意整数是逆序存储的,结果要按照题目的要求用链表连接起来遍历l1的cur1,遍历l2的cur2,和…...
Python Turtle模块详解与使用教程
Python Turtle模块详解与使用教程 引言 Python是一种广泛使用的编程语言,其简洁易读的语法使得它成为初学者学习编程的理想选择。而Turtle模块则是Python标准库中一个非常有趣且实用的图形绘制工具,特别适合用于教育和学习编程的基础知识。通过Turtle模…...

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

Node.js——fs模块-同步与异步
本文的分享到此结束,欢迎大家评论区一同讨论学习,下一篇继续分享Node.js的fs模块文件追加写入的学习。...

Java基于微信小程序的私家车位共享系统(附源码,文档)
博主介绍:✌stormjun、8年大厂程序员经历。全网粉丝15w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇&…...

vscode 创建 vue 项目时,配置文件为什么收缩到一起展示了?
一、前言 今天用 vue 官方脚手架创建工程,然后通过 vscode 打开项目发现,配置文件都被收缩在一起了。就像下面这样 这有点反直觉,他们应该是在同一层级下的,怎么会这样,有点好奇,但是打开资源管理查看&…...
PySpark任务提交
一般情况下,spark任务是用scala开发的,但是对于一些偏业务人员,或者是基于上手的来说python的API确实降低了开发前置条件的难度,首当其冲的就是能跳过Java和Scala需要的知识储备,但是在提交任务到集群的时候就很麻烦了…...

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

【大模型】海外生成式AI赛道的关键玩家:OpenAI、Anthropic之外还有谁?
引言 在生成式AI快速发展的今天,不同公司在各自领域发挥着独特作用。本文将从基础模型研发、开发工具框架、垂直领域应用三个维度,为读者梳理当前生成式AI技术领域的主要参与者,帮助开发者更好地把握技术发展方向。 一、基础模型研发公司 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 大表添加索引的最佳方式
背景: 业务系统中现在经常存在上亿数据的大表,在这样的大表上新建索引,是一个较为耗时的操作,特别是在生产环境的系统中,添加不当,有可能造成业务表锁表,业务表长时间的停服势必会影响正常业务…...
速度了解云原生后端!!!
云原生后端是指基于云计算技术和理念构建的后端系统架构,旨在充分利用云计算的优势,实现快速部署、弹性扩展、高可用性和高效运维。以下是云原生后端的一些关键特点和技术: 容器化 容器化是云原生架构的核心之一,它使用容器技术&…...
云计算Openstack 虚拟机调度策略
OpenStack的虚拟机调度策略是一个复杂而灵活的系统,它主要由两种调度器实现:FilterScheduler(过滤调度器)和ChanceScheduler(随机调度器)。以下是对这两种调度器及其调度策略的详细解释: 一、F…...
在 macOS 上添加 hosts 文件解析的步骤
步骤 1: 打开 hosts 文件 打开终端: 你可以通过 Spotlight 搜索(按 Cmd Space 并输入 Terminal)来打开终端。 使用文本编辑器打开 hosts 文件: 在终端中输入以下命令,使用 nano 文本编辑器打开 hosts 文件:…...

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

基于springboot的招聘系统的设计与实现
摘 要 随着互联网时代的发展,传统的线下管理技术已无法高效、便捷的管理信息。为了迎合时代需求,优化管理效率,各种各样的管理系统应运而生,国家在工作岗位要求不断提高的前提下,招聘系统建设也逐渐进入了信息化时代。…...
长度最小的子数组(滑动窗口)
给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 子数组 [numsl, numsl1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。 示例 1: 输入…...

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

大学英语救星!GPT助你完美解答完型填空和阅读理解
文章目录 零、前言一、再来十篇完型填空和阅读理解操作指导拍照:完型填空拍照:阅读理解 二、感受 零、前言 学习过程中,总是会遇到一些问题,但不好意思总是去麻烦问老师或同学 gpt可以帮社恐的你,解决学习问题&#…...
【linux】centos编译安装openssl1.1.1
文章目录 背景用途编译安装openssl1.1.1d测试centos的python2 ssl模块是否正常pyenv编译python3.10需要配置环境变量(必须)编译python前记得安装依赖 背景 首先, centos7 通过yum安装的openssl-devel包是1.0.2k的,这玩意儿太老了。我们选择从源码安装op…...

智慧政务标准规范介绍:构建高效、协同的政务信息体系
在当今信息化快速发展的时代,智慧政务作为政府数字化转型的重要方向,正逐步改变着政府管理和服务的方式。为了确保智慧政务系统的建设能够有序、高效地进行,国家制定了一系列标准规范,其中GB∕T 21062系列标准《政务信息资源交换体…...
【论文笔记】SecAlign: Defending Against Prompt Injection with Preference Optimization
论文信息 论文标题:SecAlign: Defending Against Prompt Injection with Preference Optimization - CCS 25 论文作者: Sizhe Chen - UC Berkeley ;Meta, FAIR 论文链接:https://arxiv.org/abs/2410.05451 代码链接:h…...

数学建模期末速成 最短路径
关键词:Dijkstra算法 Floyd算法 例题 已知有6个村庄,各村的小学生人数如表所列,各村庄间的距离如图所示。现在计划建造一所医院和一所小学,问医院应建在哪个村庄才能使最远村庄的人到医院看病所走的路最短?又问小学建…...

SpringAI+DeepSeek大模型应用开发实战
内容来自黑马程序员 这里写目录标题 认识AI和大模型大模型应用开发模型部署方案对比模型部署-云服务模型部署-本地部署调用大模型什么是大模型应用传统应用和大模型应用大模型应用 大模型应用开发技术架构 SpringAI对话机器人快速入门会话日志会话记忆 认识AI和大模型 AI的发…...

Deepin 20.9社区版安装Docker
个人博客地址:Deepin 20.9社区版安装Docker | 一张假钞的真实世界 注意事项 Deepin 20.9 社区版安装 Docker 需要注意两点: 因为某些原因,Docker 官方源基本不可用,所以需要使用镜像源进行安装。当然也可以用安装包直接安装&am…...

【Linux系统】第八节—进程概念(上)—冯诺依曼体系结构+操作系统+进程及进程状态+僵尸进程—详解!
hi,我是云边有个稻草人 偶尔中二的博主^(* ̄(oo) ̄)^,与你分享专业知识,祝博主们端午节快乐! Linux—本节博客所属专栏—持续更新中—欢迎订阅! 目录 一、冯诺依曼体系结构 二、操作系统(Opera…...
git push Git远端意外挂断
git push Git远端意外挂断 枚举对象中: 99, 完成. 对象计数中: 100% (99/99), 完成. 使用 8 个线程进行压缩 压缩对象中: 100% (78/78), 完成. send-pack: unexpected disconnect while reading sideband packet 写入对象中: 100% (82/82), 2.78 MiB | 5.56 MiB/s, 完成. 总共…...

【网络安全】——Modbus协议详解:工业通信的“通用语言”
目录 一、初识Modbus:工业通信的基石 1.1 协议全称 1.2 协议简史 二、核心特性解析 2.1 架构设计 2.2 典型应用场景 三、协议族全景图 3.1 协议栈分类 3.2 版本演进对比 四、协议报文深度解析 4.1 Modbus RTU帧结构 4.2 Modbus TCP报文 五、通信机制实…...

RK3568DAYU开发板-平台驱动开发--UART
1、程序介绍 本程序是基于OpenHarmony标准系统编写的平台驱动案例:UART 系统版本:openharmony5.0.0 开发板:dayu200 编译环境:ubuntu22 部署路径: //sample/06_platform_uart 2、基础知识 2.1、UART简介 UART指异步收发传输器(Univer…...
python常用库-pandas、Hugging Face的datasets库(大模型之JSONL(JSON Lines))
文章目录 python常用库pandas、Hugging Face的datasets库(大模型之JSONL(JSON Lines))背景什么是JSONL(JSON Lines)通过pandas读取和保存JSONL文件pandas读取和保存JSONL文件 Hugging Face的datasets库Hugg…...