LeetCode第21~25题解

CONTENTS

    • LeetCode 21. 合并两个有序链表(简单)
    • LeetCode 22. 括号生成(中等)
    • LeetCode 23. 合并K个升序链表(困难)
    • LeetCode 24. 两两交换链表中的节点(中等)
    • LeetCode 25. K 个一组翻转链表(困难)

LeetCode 21. 合并两个有序链表(简单)

【题目描述】

将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

【示例1】

在这里插入图片描述

输入:l1 = [1,2,4], l2 = [1,3,4]
输出:[1,1,2,3,4,4]

【示例2】

输入:l1 = [], l2 = []
输出:[]

【示例3】

输入:l1 = [], l2 = [0]
输出:[0]

【提示】

两个链表的节点数目范围是 [0, 50]
− 100 ≤ N o d e . v a l ≤ 100 -100\le Node.val\le 100 100Node.val100
l1l2 均按非递减顺序排列

【分析】


直接模拟即可,每次取两个链表中较小的结点,接到新链表的后面,如果其中一个链表空了,则直接将另一个链表接到新链表的后面。


【代码】

/*** 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* mergeTwoLists(ListNode* list1, ListNode* list2) {auto dummy = new ListNode(-1), cur = dummy;  // 用auto才能并排写while (list1 && list2)if (list1->val < list2->val) cur = cur->next = list1, list1 = list1->next;else cur = cur->next = list2, list2 = list2->next;if (list1) cur->next = list1;else if (list2) cur->next = list2;return dummy->next;}
};

LeetCode 22. 括号生成(中等)

【题目描述】

数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且有效的括号组合。

【示例1】

输入:n = 3
输出:["((()))","(()())","(())()","()(())","()()()"]

【示例2】

输入:n = 1
输出:["()"]

【提示】

1 ≤ n ≤ 8 1\le n\le 8 1n8

【分析】


本题只有小括号,对于这类问题,判断一个括号序列是否合法有一些很重要的推论:

  • 任意前缀中,( 数量一定大于等于 ) 数量(最重要);
  • () 的数量相等。

我们可以使用 DFS 搜索方案,对于每个位置,只要当前 ( 的数量小于 n n n 就可以填入,而填入 ) 需要满足当前 ) 的数量小于 n n n 且小于 ( 的数量。


【代码】

class Solution {
public:vector<string> res;vector<string> generateParenthesis(int n) {dfs(n, 0, 0, "");return res;}void dfs(int n, int lc, int rc, string now)  // lc和rc分别表示左右括号的数量{if (lc == n && rc == n) { res.push_back(now); return; }if (lc < n) dfs(n, lc + 1, rc, now + '(');if (rc < n && rc < lc) dfs(n, lc, rc + 1, now + ')');}
};

LeetCode 23. 合并K个升序链表(困难)

【题目描述】

给你一个链表数组,每个链表都已经按升序排列。
请你将所有链表合并到一个升序链表中,返回合并后的链表。

【示例1】

输入:lists = [[1,4,5],[1,3,4],[2,6]]
输出:[1,1,2,3,4,4,5,6]
解释:链表数组如下:
[1->4->5,1->3->4,2->6
]
将它们合并到一个有序链表中得到。
1->1->2->3->4->4->5->6

【示例2】

输入:lists = []
输出:[]

【示例3】

输入:lists = [[]]
输出:[]

【提示】

k = = l i s t s . l e n g t h k == lists.length k==lists.length
0 ≤ k ≤ 1 0 4 0\le k\le 10^4 0k104
0 ≤ l i s t s [ i ] . l e n g t h ≤ 500 0\le lists[i].length\le 500 0lists[i].length500
− 1 0 4 ≤ l i s t s [ i ] [ j ] ≤ 1 0 4 -10^4\le lists[i][j]\le 10^4 104lists[i][j]104
lists[i]升序排列
lists[i].length 的总和不超过 1 0 4 10^4 104

【分析】


和第21题差不多,我们每次从这 K K K 个链表中找出最小的结点,将其接到新链表的后面,可以使用一个小根堆(优先队列 priority_queue 来维护最小值)。需要注意的是我们需要写一个排序算法,C++ 中优先队列的排序算法不是传入一个函数,而是重载了 () 的结构体,具体实现方式见代码部分。


【代码】

/*** 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:struct Cmp{// 默认是大根堆,因此用大于号翻转为小根堆,注意一定要有{}bool operator() (ListNode*& a, ListNode*& b) { return a->val > b->val; } };ListNode* mergeKLists(vector<ListNode*>& lists) {auto dummy = new ListNode(-1), cur = dummy;priority_queue<ListNode*, vector<ListNode*>, Cmp> Q;  // 传入比较结构体for (auto list: lists)if (list) Q.push(list);  // 判断是否为空while (Q.size()){auto t = Q.top(); Q.pop();cur = cur->next = t;if (t->next) Q.push(t->next);}return dummy->next;}
};

LeetCode 24. 两两交换链表中的节点(中等)

【题目描述】

给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。

【示例1】

在这里插入图片描述

输入:head = [1,2,3,4]
输出:[2,1,4,3]

【示例2】

输入:head = [1,2,3,4]
输出:[2,1,4,3]

【示例3】

输入:head = [1]
输出:[1]

【提示】

链表中节点的数目在范围 [0, 100]
0 ≤ N o d e . v a l ≤ 100 0\le Node.val\le 100 0Node.val100

【分析】


我们通过画图可以更加直观地分析:

在这里插入图片描述

具体步骤如下:

  1. P->nextP->next->next 存在时,将其分别记为 AB
  2. P->next = B
  3. A->next = B->next
  4. B->next = A
  5. P = A

【代码】

/*** 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) {auto dummy = new ListNode(-1), cur = dummy;dummy->next = head;while (cur->next && cur->next->next){auto a = cur->next, b = cur->next->next;cur->next = b, a->next = b->next, b->next = a, cur = a;}return dummy->next;}
};

LeetCode 25. K 个一组翻转链表(困难)

【题目描述】

给你链表的头节点 head,每 k 个节点一组进行翻转,请你返回修改后的链表。
k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。
你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。

【示例1】

在这里插入图片描述

输入:head = [1,2,3,4,5], k = 2
输出:[2,1,4,3,5]

【示例2】

输入:head = [1,2,3,4,5], k = 3
输出:[3,2,1,4,5]

【提示】

链表中的节点数目为 n n n
1 ≤ k ≤ n ≤ 5000 1\le k\le n\le 5000 1kn5000
0 ≤ N o d e . v a l ≤ 1000 0\le Node.val\le 1000 0Node.val1000

【分析】


和上一题的分析类似,我们先画出示意图:

在这里插入图片描述

具体步骤如下:

  1. 先遍历一次看看 P 后面是否存在 K 个结点,若不存在直接返回结果,若存在则记最后一个结点为 V
  2. 分别将 P->nextP->next->next 记为 AB
  3. P->next = V
  4. A->next = V->next
  5. P = A
  6. B->next 记为 C
  7. B->next = A
  8. A = B, B = C
  9. 重复6~8共 K − 1 K-1 K1 次。

【代码】

/*** 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) {auto dummy = new ListNode(-1), cur = dummy;dummy->next = head;while (true){auto v = cur;for (int i = 0; i < k; i++)if (v->next == nullptr) return dummy->next;else v = v->next;auto a = cur->next, b = cur->next->next;cur->next = v, a->next = v->next, cur = a;for (int i = 0; i < k - 1; i++){auto c = b->next;b->next = a, a = b, b = c;}}return dummy->next;  // 此行避免报错,不会执行}
};

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

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

相关文章

matlab 计算点云协方差矩阵

目录 一、概述1、算法概述2、主要函数二、代码示例三、结果展示四、参数解析输入参数输出参数五、参考链接本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、概述

C语言——程序执行的三大流程

顺序 : 从上向下&#xff0c; 顺序执行代码分支 : 根据条件判断&#xff0c; 决定执行代码的分支循环 : 让特定代码重复的执行

构建智慧停车场:4G DTU实现无线数据高速传输

物联网技术的快速发展使得各种设备能够实现互联互通&#xff0c;无线网络技术给我们的日常生活带来了极大的便利。其中的网络技术如无线WiFi及4G网络已经成为了物联网应用中不可或缺的组成部分。而在工业领域中对4G无线路由器的应用是非常广泛的&#xff0c;人们通过4G工业路由…

SpringBoot日志配置

SpringBoot默认日志事打印在console控制台中&#xff0c;不会保存到文件中。 实际项目中必须保存到文件中进行日志分析 一、使用xml配置日志保存&#xff08;并不需要pom配置slf4j依赖&#xff0c;使用这个默认不用配置pom依赖&#xff0c;最新的spring-boot-starter-web中已…

社招中级前端笔试面试题总结

前端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★ 地址&#xff1a;前端面试题库 typeof null 的结果是什么&#xff0c;为什么&#xff1f; typeof null 的结果是Object。 在 JavaScript 第一个版本中&#xff0c;所有值都存储在 32…

专线连接交换机设置 – 如何实现高效率的网络连接?

专线链接交换机设置 – 如何实现高效率的网络连接&#xff1f; 什么是专线连接交换机&#xff1f; 在现代互联网中&#xff0c;网络连接的快速和高效是至关重要的。尤其是对于需要大量数据传输和保证网络稳定性的企业和组织来说&#xff0c;专线连接交换机是一项非常重要的技…

参与线上活动赢GLMR!在韩国和新加坡遇见Moonbeam

随着8月进入尾声&#xff0c;月圆人团圆的中秋节也已经近在眼前&#xff0c;凉爽的秋天将会为大地带来新的气象。而今年秋天对于区块链产业以及Moonbeam来说与以往不同&#xff0c;将是一个热闹且充满活动的季节。 9月初将会迎来韩国最大的区块链活动&#xff0c;韩国区块链周K…

SpringBoot项目在启动后自动关闭

问题描述&#xff1a; 今天搭建了一个SpringBoot项目&#xff0c;但是在启动之后就自行关闭了&#xff0c;就像下面这样&#xff1a; 原因分析&#xff1a;在创建SpringBoot项目的时候&#xff0c;Web的依赖没有导入&#xff0c;默认以普通java项目运行导致的终止。 解决方案…

【2023】Spring Validation中@NotNull注解、@NotBlank注解介绍以及使用

【2023】Spring Validation中NotNull注解、NotBlank注解介绍以及使用 前言一、简介spring-validation框架的常用注解 二、代码实现添加依赖1、实体举例2、Controller层:3、统一异常处理4、结果返回验证通过返回验证失败返回 前言 平常我们在编写代码的时候总需要很多if判空&am…

SSM - Springboot - MyBatis-Plus 全栈体系(二)

第一章 Maven 三、Maven 核心功能依赖和构建管理 1. 依赖管理和配置 Maven 依赖管理是 Maven 软件中最重要的功能之一。Maven 的依赖管理能够帮助开发人员自动解决软件包依赖问题&#xff0c;使得开发人员能够轻松地将其他开发人员开发的模块或第三方框架集成到自己的应用程…

已知两地经纬度,计算两地直线距离

文章目录 1 原理公式2 代码实现2.1 JavaScript2.2 C2.3 Python2.4 MATLAB 1 原理公式 在地球上&#xff0c;计算两点之间的直线距离通常使用地理坐标系&#xff08;例如WGS84&#xff09;。计算两地直线距离的公式是根据经纬度之间的大圆距离&#xff08;Great Circle Distanc…

【力扣】55、跳跃游戏

var canJump function(nums){let cover 0;for(let i0;i<nums.length;i){if(i<cover){cover Math.max(nums[i]i,cover);if(cover >nums.length-1){return true;}}}}

手把手教你Jenkins整合Jmeter实现自动化接口测试

01、在机器上安装jmeter 下载&#xff1a;http://jmeter.apache.org/download_jmeter.cgi 这里我用了一台Windows安装jmeter用来写接口测试的脚本&#xff0c;启动前修改jmeter.properties 中 jmeter.save.saveservice.output_format值为xml。 编写接口测试脚本&#xff1a; …

CTFhub-文件上传-无验证

怎样判断一个网站是 php asp jsp 网站 首先&#xff0c;上传用哥斯拉生成 .php 文件 然后&#xff0c;用蚁剑测试连接 找到 flag_1043521020.php 文件&#xff0c;进去&#xff0c;即可发现 flag ctfhub{ee09842c786c113fb76c5542}

GPT-3在化学中进行低数据发现是否足够?

今天介绍一份洛桑联邦理工学院进行的工作&#xff0c;这份工作被发表在化学期刊预印本网站上。 对于这份工作&#xff0c;有兴趣的朋友可以通过我们的国内ChatGPT镜像站进行测试使用&#xff0c;我们的站点并没有针对特定任务进行建设&#xff0c;是通用性质的。 化学领域进行…

Acwing798.差分矩阵

前缀和与差分 图文并茂 超详细整理&#xff08;全网最通俗易懂&#xff09;_前缀和差分_林小鹿的博客-CSDN博客 代码展示&#xff1a; #include<iostream> #include<cstdio> using namespace std; const int N 1e3 10; int a[N][N], b[N][N]; void insert(int x…

V4L2 摄像头应用编程

目录 V4L2 简介V4L2 摄像头应用程序打开摄像头查询设备的属性/能力/功能设置帧格式、帧率申请帧缓冲、内存映射入队开启视频采集 ALPHA/Mini I.MX6U 开发板配套支持多种不同的摄像头&#xff0c;包括正点原子的ov5640&#xff08;500W 像素&#xff09;、 ov2640&#xff08;20…

2023-08-27 LeetCode每日一题(合并区间)

2023-08-27每日一题 一、题目编号 56. 合并区间二、题目链接 点击跳转到题目位置 三、题目描述 以数组 intervals 表示若干个区间的集合&#xff0c;其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间&#xff0c;并返回 一个不重叠的区间数组&#…

【HSPCIE仿真】输入网表文件(3)子电路描述语句

子电路描述语句 1. 子电路的定义定义子电路的基本语法子电路终止语句子电路的调用语句全局节点(.gloab)示例 2. 基于子电路执行多次分析 HSPICE 允许用户在程序执行过程中调用由各种 HSPICE 元件和器件构成的子电路&#xff0c;即电路结构的层次化描述。 子电路是以 .SUBCKT 或…

git clone 报SSL证书问题

git命令下运行 git config --global http.sslVerify false 然后再进行重新clone代码