leetcode算法之链表

目录

  • 1.两数相加
  • 2.两两交换链表中的节点
  • 3.重排链表
  • 4.合并K个升序链表
  • 5.K个一组翻转链表

1.两数相加

两数相加
在这里插入图片描述

/*** 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* addTwoNumbers(ListNode* l1, ListNode* l2) {ListNode* newhead = new ListNode(0);ListNode* prev = newhead;int t = 0;ListNode* cur1 = l1,*cur2 = l2;while(cur1 || cur2 || t){if(cur1){t += cur1->val;cur1 = cur1->next;}if(cur2){t += cur2->val;cur2 = cur2->next;}prev->next = new ListNode(t%10);prev = prev->next;t /= 10;}prev = newhead->next;delete newhead;return prev;}
};

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://模拟 循环 迭代ListNode* swapPairs(ListNode* head) {if(head == nullptr || head->next == nullptr) return head;ListNode* ret = new ListNode(0);ListNode* prev = ret;prev->next = head;ListNode* cur = prev->next,*next = cur->next,*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;}cur = ret->next;delete ret;return cur;}
};

3.重排链表

重排链表
在这里插入图片描述

/*** 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(head == nullptr || head->next == nullptr || head->next->next == nullptr) return;ListNode* ret = new ListNode(0);ListNode* prev = ret;//1.找中间节点ListNode* slow = head,*fast = head;while(fast && fast->next){slow = slow->next;fast = fast->next->next;}//2.将slow后面的链表部分逆序ListNode* newhead = new ListNode(0);ListNode* cur = slow->next;slow->next = nullptr;//将前一段链表和后一段链表断开while(cur){ListNode* next = cur->next;cur->next = newhead->next;newhead->next = cur;cur = next;}//3.合并两个链表ListNode* cur1 = head,*cur2 = newhead->next;while(cur1 || cur2){if(cur1){prev->next = cur1;cur1 = cur1->next;prev = prev->next;}if(cur2){prev->next = cur2;cur2 = cur2->next;prev = prev->next;}}delete ret;delete newhead;}
};

4.合并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 {//法一:struct cmp{bool operator()(const ListNode* l1,const ListNode* l2){return l1->val>l2->val;}};
public:ListNode* mergeKLists(vector<ListNode*>& lists) {if(lists.size() == 0) return nullptr;if(lists.size() == 1) return lists[0];//使用优先级队列,即最小堆来解决priority_queue<ListNode*,vector<ListNode*>,cmp> heap;ListNode* ret = new ListNode(0);ListNode* prev = ret;for(auto l:lists){if(l) heap.push(l);}while(!heap.empty()){ListNode* t = heap.top();heap.pop();prev->next = t;prev = t;if(t->next) heap.push(t->next);}prev = ret->next;delete ret;return prev;}
};
/*** 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* mergeKLists(vector<ListNode*>& lists) {return merge(lists,0,lists.size()-1);}ListNode* merge(vector<ListNode*>& lists,int left,int right){if(left > right) return nullptr;if(left == right) return lists[left];//1.选择中间元素划分区间int mid = (left+right)>>1;//[left,mid][mid+1,right]//2.处理左右区间ListNode* l1 = merge(lists,left,mid);ListNode* l2 = merge(lists,mid+1,right);//3.合并两个有序链表ListNode* ret = new ListNode(0);ListNode* prev = ret;ListNode* cur1 = l1,*cur2 = l2;while(cur1 && cur2){if(cur1->val <= cur2->val){prev->next = cur1;prev = prev->next;cur1 = cur1->next;}else{prev->next = cur2;prev = prev->next;cur2 = cur2->next;}}if(cur1) prev->next = cur1;if(cur2) prev->next = cur2;prev = ret->next;delete ret;return prev;}
};

5.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:ListNode* reverseKGroup(ListNode* head, int k) {//模拟if(head==nullptr || head->next==nullptr) return head;//1.计算需要翻转的组数nint n = 0;ListNode* cur = head;while(cur){n++;cur = cur->next;}n /= k;cur = head;//2.重复n次,长度为n的链表逆序ListNode* ret = new ListNode(0);ListNode* prev = ret;for(int i = 0;i<n;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 = ret->next;delete ret;return prev;}
};

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

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

相关文章

java mail集成james判断邮件是否发送成功

项目场景&#xff1a; java mail集成james邮件服务器&#xff0c;发送邮件时需要判断邮件是否发送成功。我们会发现JavaMail给用户发送邮件&#xff0c;但是调用Transport类的sendMessage方法发送的邮件是没有返回值的&#xff0c;所以判断不了。 但是我们可以用另一个解决方案…

TDI网络过滤驱动应用(一)

文章目录 TDI网络过滤驱动应用1. 技术概览2. 数据包的抓取3. 应用实例3.1 TrafficShaper(限流)3.2 DnsRedirector(DNS重定向)3.3 TcpRedirector(TCP重定向) 4. 总结与参考 TDI网络过滤驱动应用 在前面的文章中&#xff0c;我们分析了TDI网络过滤驱动的基本开发框架以及TDI网络…

C/C++ 实现FTP文件上传下载

FTP&#xff08;文件传输协议&#xff09;是一种用于在网络上传输文件的标准协议。它属于因特网标准化的协议族之一&#xff0c;为文件的上传、下载和文件管理提供了一种标准化的方法&#xff0c;在Windows系统中操作FTP上传下载可以使用WinINet库&#xff0c;WinINet&#xff…

微服务--07--Seata 分布式事务

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 分布式事务1.认识Seata2.部署TC服务2.1.准备数据库表2.2.准备配置文件2.3.Docker部署 3.微服务集成Seata3.1.引入依赖3.2.改造配置3.3.添加数据库表3.4.测试 分布式…

什么是网络安全 ?

网络安全已成为我们生活的数字时代最重要的话题之一。随着连接设备数量的增加、互联网的普及和在线数据的指数级增长&#xff0c;网络攻击的风险呈指数级增长。 但网络安全是什么意思&#xff1f; 简而言之&#xff0c;网络安全是一组旨在保护网络、设备和数据免受网络攻击、…

Zabbix“专家坐诊”第213期问答汇总

问题一 Q&#xff1a;Zabbix报错&#xff1a;Zabbix server is not running :the information displayed may not be current&#xff0c;是什么问题呢&#xff1f; A&#xff1a; 1、数据库软件问题导致导入的zabbix数据库不完整2、zabbix Server配置问题3、zabbix-server没…

大数据基础设施搭建 - Maxwell

文章目录 一、上传压缩包二、解压压缩包三、启用MySQL Binlog3.1 修改MySQL配置文件3.2 重启MySQL服务3.3 测试 四、创建Maxwell所需数据库和用户4.1 创建数据库4.2 调整MySQL数据库密码级别4.3 创建Maxwell用户并赋予其必要权限4.4 测试 五、修改配置文件5.1 修改Maxwell配置文…

【【FPGA的 MicroBlaze 的 介绍与使用 】】

FPGA的 MicroBlaze 的 介绍与使用 可编程片上系统&#xff08;SOPC&#xff09;的设计 在进行系统设计时&#xff0c;倘若系统非常复杂&#xff0c;采用传统 FPGA 单独用 Verilog/VHDL 语言进行开发的方式&#xff0c;工作量无疑是巨大的&#xff0c;这时调用 MicroBlaze 软核…

laravel 重写批量添加,自动维护时间戳

laravel 自带的批量添加是不会自动维护时间戳的&#xff0c;意思是说&#xff0c;使用laravel的批量添加&#xff0c;时间戳字段不会插入&#xff0c;也不会在更新的时候进行更新。 使用继承或者trait来解决这个问题&#xff0c;在这里感谢Mr.wen <?php namespace App\Mo…

作 业

1. 查出至少有一个员工的部门。显示部门编号、部门名称、部门位置、部门人数。 mysql> SELECT d.deptno AS 部门编号, d.dname as 部门名称, d.loc as 部门位置, COUNT(e.empno) as 部门人数 FROM dept d JOIN employee e ON d.deptno e.deptno GROUP BY d.deptno, d.dname…

LeetCode 1657. 确定两个字符串是否接近:思维题

【LetMeFly】1657.确定两个字符串是否接近&#xff1a;思维题 力扣题目链接&#xff1a;https://leetcode.cn/problems/determine-if-two-strings-are-close/ 如果可以使用以下操作从一个字符串得到另一个字符串&#xff0c;则认为两个字符串 接近 &#xff1a; 操作 1&…

nvm 下载node时候下载不到npm包的解决方法

个人博客链接 公众号-nvm 下载node时候下载不到npm包的解决方法 求关注 可以跳过的背景 最近项目比较有空&#xff0c;所以就可以有时间写一些demo&#xff0c;主要测试下react的一些语法&#xff0c;毕竟自己上次写react已经是22年的7月份了,期间对于react-router等的hook…

Java中的Integer.bitCount浅析

文章目录 Java中的Integer.bitCount浅析问题思考Integer.bitCount解释拓展 Java中的Integer.bitCount浅析 原文链接 问题 有一个整数x,我们需要统计该整数的二进制表示中包含的1的个数。这个也被称为汉明重量&#xff08;Hamming weight&#xff09;。 例如&#xff0c;整数…

000 - 前言

目录 问题1&#xff1a;学Qt之前是不是得先把C基础打好才行&#xff1f;会一点点C可以学吗&#xff1f; 问题2&#xff1a;我已经会 PyQt 了&#xff0c;还有必要再学 Qt 吗&#xff1f; 问题3&#xff1a;Qt 和 QML 学哪个比较好呢&#xff1f; 大家好呀~ 我是角角。从今天…

创建JDK8版本的SpringBoot项目的方法

目录 一.通过阿里云下载 二.通过IDEA创建 1.下载安装JDK17 2.创建SpringBoot 3.X的项目 3.把JDK17改成JDK8 截止到2023.11.24&#xff0c;SpringBoot不再支持3.0X之前的版本&#xff0c;3.0X之后的版本所对应的JDK版本为JDK17&#xff0c;下面介绍如何在idea上继续使用JDK…

解析javascript数组方法 find 和 filter 有何区别

首先用一个案例可以很直观的看到 find 和 filter 的区别&#xff1b; 相同点&#xff1a; 两者分别可以接受三个参数&#xff1a;当前元素、当前索引、整个数组&#xff1b;两者都可以用来查找数组中符合条件的元素&#xff1b; 不同点&#xff1a; find&#xff1a; 用于查…

YOLOv8+Nanodet强强联合改进标签分配:使用NanoDet动态标签分配策略,同时集成VFL全新损失,来打造新颖YOLOv8检测器

💡本篇内容:YOLOv8+Nanodet强强联合改进标签分配:使用NanoDet动态标签分配策略,同时集成VFL全新损失,来打造新颖YOLOv8检测器 💡🚀🚀🚀本博客 YOLO系列 + 改进NanoDet模型的动态标签分配策略源代码改进 💡一篇博客集成多种创新点改进:VFL损失函数 + Nanodet…

C/C++不定参数的使用

文章目录 C语言的不定参C的不定参 C语言的不定参 C语言的不定参数最常见的应用示例就是printf函数&#xff0c;如下&#xff0c;参数列表中的...表示不定参数列表 #include <stdio.h> int printf(const char *format, ...);试着模拟实现C语言的printf函数 void myprin…

Android:BackStackRecord

BackStackRecord:fragment回退栈,继承自FragmentTransaction,并且实现了OpGenerator接口,OpGenerator接口用来添加或弹出事务的,后面会提到。 从《Android:从源码看FragmentManager如何工作》文章知道,每次beginTransaction会创建一个BackStackRecord对象,改对象持有f…

C++基础——文件操作

文章目录 1 概述2 文本文件2.1 写文件2.1.1 写文件流程2.1.2 文件打开方式 2.2 读文件 3 二进制文件3.1 写文件3.2 读文件 1 概述 程序最基本的操作之一就是文件操作&#xff0c;程序运行时的数据都是临时数据&#xff0c;当程序结束后就不复存在了。通常都是通过文件或其他持…