【算法刷题】第二篇——链表(一)

news/2024/5/19 19:45:36/文章来源:https://blog.csdn.net/weixin_45750572/article/details/126960059

 8420b26844034fab91b6df661ae68671.png

个人简介: 

> 📦个人主页:赵四司机
> 🏆学习方向:JAVA后端开发 
> 📣种一棵树最好的时间是十年前,其次是现在!
> 🔔博主推荐网站:牛客网  刷题|面试|找工作神器
> 💖喜欢的话麻烦点点关注喔,你们的支持是我的最大动力。

前言:

最近有不少小伙伴私信博主问我马上到秋招了,而自己平时没怎么练过算法,在算法这一块存在很大的弱势,应该怎么快速提升自己的算法水平。在这里我首先要说的是算法能力并不是可以快速掌握的,这需要慢慢积累,因为算法不仅考验我们的知识记忆深度,还考验我们的思维广度,因此很多很多大厂面试都会注重算法的考核。

其实博主一开始也没怎么练过算法题,但是对于中等简单的算法题还是可以通过一段时间的刷题来习得的。我最近就在一个叫牛客网的网站上面刷面试算法题,上面还很贴心给我们总结出了常考的题目,像剑指Offer、面试必刷Top101、面试高频榜单都有,先上图为证:

 怎样,是不是很心动,下面我给你们介绍一下这个网站,传送门:牛客刷题神器

目录

一:反转链表

1.题目要求

2.解题思路

3.代码实现

二:链表中的节点每k个一组翻转

1.题目要求

2.解题思路

3.代码实现

三:合并两个排序的链表

1.题目要求

2.实现思路

 3.代码实现

四:合并k个已排序的链表

1.题目要求

2.实现思路

3.代码实现


一:反转链表

1.题目要求

给定一个单链表的头结点pHead(该头节点是有值的,比如在下图,它的val是1),长度为n,反转该链表后,返回新链表的表头。

要求:空间复杂度 O(1)O(1) ,时间复杂度 O(n)O(n) 。

如当输入链表{1,2,3}时,经反转后,原链表变为{3,2,1},所以对应的输出为{3,2,1}。

以上转换过程如下图所示:

2.解题思路

        反转链表可以考虑用栈来解决,将链表节点依次进栈,然后再出栈形成链表即可,但是这样空间复杂度就为O(n)级别。 

        我们可以做到在空间复杂度为O(1)级别情况下解决问题,可以做到原地反转链表。具体做法为摘掉当前节点然后将其链接到前面形成的链表后面,当然还需要另外一个节点记录尚未反转的链表表头。

3.代码实现

/*
public class ListNode {int val;ListNode next = null;ListNode(int val) {this.val = val;}
}*/
public class Solution {public ListNode ReverseList(ListNode head) {ListNode newHead = null;while(head != null) {ListNode temp = head.next;head.next = newHead;newHead = head;head = temp;}return newHead;}
}

二:链表中的节点每k个一组翻转

1.题目要求

将给出的链表中的节点每 k 个一组翻转,返回翻转后的链表。如果链表中的节点数不是 k 的倍数,将最后剩下的节点保持原样。你不能更改节点中的值,只能更改节点本身。

要求空间复杂度 O(1)O(1),时间复杂度 O(n)O(n)

例如:

给定的链表是 1→2→3→4→5

对于 k = 2k=2 , 你应该返回 2→1→4→3→5

对于 k = 3k=3 , 你应该返回 3→2→1→4→5

2.解题思路

  • step 1:每次从进入函数的头节点优先遍历链表k次,分出一组,若是后续不足k个节点,不用反转直接返回头。
  • step 2:从进入函数的头节点开始,依次反转接下来的一组链表,反转链表同上。
  • step 3:这一组经过反转后,原来的头变成了尾,后面接下一组的反转结果,下一组采用上述递归继续。

3.代码实现

import java.util.*;/** public class ListNode {*   int val;*   ListNode next = null;* }*/public class Solution {/*** * @param head ListNode类 * @param k int整型 * @return ListNode类*/public ListNode reverseKGroup (ListNode head, int k) {// write code hereListNode tail = head;for(int i = 0; i < k; i++) {if(tail == null)return head;tail = tail.next;}//翻转链表ListNode pre = null;ListNode cur = head;while(cur != tail) {ListNode temp = cur.next;cur.next = pre;pre = cur;cur = temp;}head.next = reverseKGroup(tail,k);return pre;}
}

三:合并两个排序的链表

1.题目要求

输入两个递增的链表,单个链表的长度为n,合并这两个链表并使新链表中的节点仍然是递增排序的。

数据范围: 0≤n≤1000,−1000≤节点值≤1000
要求:空间复杂度 O(1)O(1),时间复杂度 O(n)O(n)

如输入{1,3,5},{2,4,6}时,合并后的链表为{1,2,3,4,5,6},所以对应的输出为{1,2,3,4,5,6},转换过程如下图所示:

 

或输入{-1,2,4},{1,3,4}时,合并后的链表为{-1,1,2,3,4,4},所以对应的输出为{-1,1,2,3,4,4},转换过程如下图所示:

 

2.实现思路

初始化:定义cur指向新链表的头结点
操作:

  1. 如果l1指向的结点值小于等于l2指向的结点值,则将l1指向的结点值链接到cur的next指针,然后l1指向下一个结点值
  2. 否则,让l2指向下一个结点值
  3. 循环步骤1,2,直到l1或者l2为nullptr
  4. 将l1或者l2剩下的部分链接到cur的后面

 3.代码实现

/*
public class ListNode {int val;ListNode next = null;ListNode(int val) {this.val = val;}
}*/
public class Solution {public ListNode Merge(ListNode list1,ListNode list2) {ListNode res = new ListNode(-1);ListNode cur = res;while(list1 != null && list2 != null) {if(list1.val < list2.val) {cur.next = list1;cur = list1;list1 = list1.next;} else {cur.next = list2;cur = list2;list2 = list2.next;}}cur.next = (list1 == null) ? list2 : list1;return res.next;}
}

四:合并k个已排序的链表

1.题目要求

合并 k 个升序的链表并将结果作为一个升序的链表返回其头节点。

数据范围:节点总数 0≤n≤5000,每个节点的val满足 |val| <= 1000∣val∣<=1000

要求:时间复杂度 O(nlogn)O(nlogn)

示例1

输入:[{1,2,3},{4,5,6,7}]

复制返回值:{1,2,3,4,5,6,7}

示例2

输入:[{1,2},{1,4,5},{6}]

复制返回值:{1,1,2,4,5,6}

2.实现思路

        可以考虑使用优先队列解决问题,优先队列即PriorityQueue,是一种内置的机遇堆排序的容器,分为大顶堆与小顶堆,大顶堆的堆顶为最大元素,其余更小的元素在堆下方,小顶堆与其刚好相反。且因为容器内部的次序基于堆排序,因此每次插入元素时间复杂度都是O(log2n)O(log_2n)O(log2​n),而每次取出堆顶元素都是直接取出。 

具体实现:

  • step 1:不管是Java还是C++都需要重载比较方法,构造一个比较链表节点大小的小顶堆。
  • step 2:先遍历k个链表头,将不是空节点的节点加入优先队列。
  • step 3:每次依次弹出优先队列中的最小元素,将其连接在合并后的链表后面,然后将这个节点在原本链表中的后一个节点(如果不为空的话)加入队列,类似上述归并排序双指针的过程。

3.代码实现

/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode(int x) {*         val = x;*         next = null;*     }* }*/import java.util.*;
public class Solution {public ListNode mergeKLists(ArrayList<ListNode> lists) {PriorityQueue<ListNode> queue = new PriorityQueue<>((val1,val2) -> val1.val - val2.val);for(int i =0; i < lists.size(); i++) {if(lists.get(i) != null) {queue.add(lists.get(i));}}ListNode res = new ListNode(-1);ListNode cur = res;while(!queue.isEmpty()) {cur.next = queue.remove();cur = cur.next;if(cur.next != null) {queue.add(cur.next);}}return res.next;}
}

今天的题目介绍就到这,实践才是检验真理的唯一标准,算法光看还不行,必须得自己动手练习,传送门链接,一键直达练习场 :牛客网  刷题|面试|找工作神器  

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

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

相关文章

java注册界面发送邮箱验证码(无线程版)

​ 邮箱验证注册 本篇文章使用第三方jar包实现邮箱发送验证码来注册用户&#xff0c;该文章未采用线程如果多人访问注册注册页面发送邮件可能会导致服务器崩溃&#xff0c;建议采用线程发送邮件&#xff01;&#xff01;&#xff01; 一、前期准备工作 1.发送验证码所需要用…

MinGW-w64安装教程——著名C/C++编译器GCC的Windows版本

MinGW-w64安装教程——著名C/C编译器GCC的Windows版本 MinGW-w64安装教程——著名C/C编译器GCC的Windows版本 本文主要讲述如何安装 C语言 编译器——MinGW-w64&#xff0c;特点是文章附有完整详细的实际安装过程截图&#xff0c;文字反而起说明提示作用。 编写本文的原因始于…

计算机三级数据库技术

第一章 数据库应用系统开发方法 数据库应用系统生命周期 软件工程与软件开发方法 瀑布模型 快速原型模型 螺旋模型 DBAS生命周期 DBAS生命周期&#xff1a;项目规划、需求分析、系统设计、实现与部署、运行与维护 规划与分析 可行性分析&#xff1a;经济可行性、技术可行性、操…

NoSQL之redis配置

目录 关系数据库与非关系数据库 关系数据库与非关系数据库概念 关系型数据库和非关系型数据库区别 关系型数据库与非关系型数据库特点 字段保存方式 Redis Redis 优点 Redis为什么这么快&#xff1f; redis安装部署 redis工具 redis 命令工具 redis-cli 命令行工具 …

Mybatis中如何实现一对一,一对多的关联查询?

MyBatis实现一对一、一对多关联查询一般有两种方式&#xff1a; 方式一&#xff1a;sqlMapper配置文件 一对一&#xff1a;在resultMap标签中使用 association 标签 一对多&#xff1a;在resultMap 标签中使用collection 标签 方式二&#xff1a;注解 一对一&#xff1a;在…

MySQL使用简单教程

本文通过演示如何使用MySQL客户机程序创建和使用一个简单的数据库&#xff0c;允许连接到MySQL服务器、运行查询和查看结果。 mysql也可以在批处理模式下使用&#xff1a;预先将查询放在文件中&#xff0c;然后告诉mysql执行文件的内容。 要查看mysql提供的选项列表&#xff0c…

解决MySQL插入不了中文数据问题

&#x1f388;目录&#x1f388; 原因⁉ 具体解决方法 1️⃣创建数据库时设置字符集为utf8 2️⃣修改数据库配置文件&#xff08;比较麻烦&#xff09; 我们使用MySQL可能会遇到加入中文报错的情况&#xff0c;如下。 报错&#xff1a;非法的字符值 放入 ‘name’ 为什么…

MySQL 复制架构

MySQL 复制架构 第一节 概述 1.1 数据拓展 热备份&#xff1a;数据库在运行的过程中&#xff0c;对数据进行备份操作。相对的&#xff0c;还有冷备份&#xff0c;冷备份需要停机&#xff0c;然后对数据进行备份操作。多活&#xff1a;所谓的多活&#xff0c;就是让数据库机器…

习惯了微信聊天,利用WebSocket手动实现个聊天功能怎么样?

1.背景 基于项目需求&#xff0c;最近需要实现一个简单的聊天功能。日常生活中&#xff0c;大家对于聊天也习以为常&#xff0c;微信、QQ等软件也经常用到&#xff0c;其实我们也可以引入一些第三方的sdk包等去实现&#xff0c;也可以利用WebSocket通信协议去手动实现简单的聊…

【蓝桥杯】第十三届蓝桥杯省赛 AK 攻略 —— C++ B组全真题超详细剖析

&#x1f384;目录&#x1f33c;写在前面&#x1f33b; A题 --- 九进制转十进制&#x1f337; 题目描述&#x1f337; 解题思路&#x1f337; 代码编写&#x1f33b; B题 --- 顺子日期&#x1f337; 题目描述&#x1f337; 解题思路&#x1f337; 代码编写&#x1f33b; C题 --…

92年程序员发帖晒薪资称自己很迷茫,网友:老弟你可以了

当下&#xff0c;是一个“向钱看&#xff0c;向厚赚”的社会。快节奏的生活下&#xff0c;家庭、工作各方面压力很容易使年轻人陷入迷茫和焦虑。 与其他行业相比&#xff0c;程序员的高薪让人羡慕。那么&#xff0c;对于那些真正达到这么多收入的人来说&#xff0c;他们是怎么…

Mysql安装包安装教程(亲测简单高效版)

Mysql安装包安装教程&#xff08;亲测简单高效版&#xff09;安装流程mysql安装SQLyog安装安装流程 mysql安装 1.下载mysql&#xff0c;官方地址&#xff1a;mysql官网 2.解压mysql安装包到任意目录下 3.新建my.ini文件 4.配置my.ini [mysqld] basedirD:\Program Files\J…

sql语法:详解DDL

Mysql版本&#xff1a;8.0.26 可视化客户端&#xff1a;sql yog 目录一、DDL是什么&#xff1f;二、和数据库相关的DDL2.1 创建数据库2.2 删除数据库2.3 查看所有的数据库&#xff0c;当前用户登录后&#xff0c;可以看到哪些数据库2.4 查看某个数据库的详细定义2.5 修改数据库…

Windows系统GIT安装与GitHub远程仓库

文章目录Windows系统GIT安装Git是什么windows环境安装环境变量验证安装GitHub与远程仓库GitHub是什么GitHub账号注册创建本地SSH KeyGitHub接入本地电脑公匙创建个人远程库传送门Windows系统GIT安装 Git是什么 Git&#xff08;读音为/gɪt/&#xff09;是一个开源的分布式版本…

接口测试之Postman使用全指南(原来使用 Postman测试API接口如此简单)

目录 一、Postman背景介绍 二、Postman的操作环境 三、Postman重要提示&#xff1a; 四、什么是接口测试 五、接口测试工具 六、接口测试流程 七、接口测试执行 八、全局变量和环境变量 九、postman接口关联 十、postman动态参数 十一、postman断言 十二、postman用…

Unity --- Transform类

1.一个很有意思的事实是Transform类不仅用来管理游戏物体的位置缩放旋转&#xff0c;还用来管理游戏物体的父物体与子物体之间的关系 当游戏物体A的trasnform类a是游戏物体B的transform类b的父类的话&#xff0c;游戏物体A就是游戏物体B的父物体 2.如何访问脚本当前挂载的游戏…

手把手教你安装VSCode(附带图解步骤)

一、前端工具vscode 1.1、概述 前端开发是创建Web页面或app等前端界面呈现给用户的过程&#xff0c;通过HTML&#xff0c;CSS及JavaScript以及衍生出来的各种技术、框架、解决方案&#xff0c;来实现互联网产品的用户界面交互 [1] 。它从网页制作演变而来&#xff0c;名称上有…

如何用Python对股票数据进行LSTM神经网络和XGboost机器学习预测分析(附源码和详细步骤),学会的小伙伴们说不定就成为炒股专家一夜暴富了

前言 最近调研了一下我做的项目受欢迎程度&#xff0c;大数据分析方向竟然排第一&#xff0c;尤其是这两年受疫情影响&#xff0c;大家都非常担心自家公司裁员或倒闭&#xff0c;都想着有没有其他副业搞搞或者炒炒股、投资点理财产品&#xff0c;未雨绸缪&#xff0c;所以不少…

你单位数字化转型了吗?

写在前面&#xff1a;本文由Bing AI和我一起完成&#xff0c;它完成90%内容&#xff0c;致谢&#xff01; 1.数字化转型 近两年数字化转型在社会面搞得轰轰烈烈&#xff0c;数字化转型是指&#xff0c;利用新一代信息技术&#xff0c;构建数据的采集、传输、存储、处理和反馈的…

抓取某话题下指定时间内的微博数据,包括博文数据、评论信息等(可通过高级搜索筛选时间)

代码有点长&#xff0c;完整代码放在文章最后了。 最后的数据存储为了3个表&#xff0c;表的各字段如下&#xff1a; # csv头部 writer.writerow((话题链接, 话题内容, 楼主ID, 楼主昵称, 楼主性别, 发布日期,发布时间, 转发量, 评论量, 点赞量, 评论者ID, 评论者昵称,评论者…