【算法刷题】链表笔试题解析(1)

 

一、链表分割

题目描述:

链接:链表分割

d908ed776515446ba1ee0ca64e55793b.png

题目分析:

        这题直接处理并不好做,我们可以构建前后两个链表,将小于x值的结点放在链表a内,将其它结点放在链表b内,这样将原链表遍历完后,原链表就自然地分成了两部分,最后将两个链表拼接起来就行了。

如果你以为这题到这里就完了,那这题就不会被分在“较难题”里了

        做算法题,我们一定要细心,要考虑好程序可能会面临的所有情况,仔细梳理一下,你会发现这道题主要会有四种情况:

1、给定链表为空

2、链表中的值有大于x的,也有小于x的

3、链表中所有结点的值都大于x

4、链表中所有节点的值都小于x

这时问题就很明显了,我们之前的思路只能处理第二种情况,遇到其它情况的时候就会出现问题。

比如在第三种情况下,由于没有小于x的结点,所以链表a的头尾指针都不能指向具体的结点,这时如果再通过a链表的尾节点指向b链表的方式链接,就会出现空指针异常导致程序出错了

因此我们还需要分别处理其它三种情况:

1、因为链表为空,所以不需要处理,直接返回头结点即可

3、此时a链表的头指针应该为空,只需要返回b链表的头结点即可

4、此时b链表为空,正常让a的尾结点指向b的头,直接返回头结点即可

注意:二三种情况时需要将b的尾结点的后驱结点置空,这样才能构建一个正常的单链表


代码实现:

public class Partition {public ListNode partition(ListNode pHead, int x) {// write code hereif(pHead==null){return pHead;}ListNode as=null;ListNode ae=null;ListNode bs=null;ListNode be=null;ListNode cur=pHead;while(cur != null){if(cur.val<x){if(as==null){as=cur;ae=cur;}else{ae.next=cur;ae=ae.next;}         }else{if(bs==null){bs=cur;be=cur;}else{be.next=cur;be=be.next;} }cur=cur.next;}if(as==null){be.next=null;return bs;}ae.next=bs;if(bs!=null){be.next=null;}return as;}
}

二、链表的回文结构

题目描述:

链接:链表的文结构

da5cea59b7bc46d2923b22b02920ddaf.png

题目分析:

有些人看到这题的第一想法可能是遍历一遍链表,将链表中的值都存在一个数组中,然后用数组的处理方法来判断是否回文,从而大大简化题目难度。

这的确是一个不错的思路,但你有没有发现题目还有以下要求:

时间复杂度为O(n),额外空间复杂度为O(1)的算法

如果你不知道什么是时间复杂度和空间复杂度的话,可以看看博主的这篇文章:博客链接

很明显,数组的空间复杂度是O(N),不符合题目要求,出题者明显不想让你用这么粗暴的方式解题

这里博主提供一个简单的思路:

我们可以先将链表反转,然后判断两个链表相应位置上的值是否相等即可

 

代码实现:

public class PalindromeList {public boolean chkPalindrome(ListNode A) {// write code hereif(A==null||A.next==null){return true;}ListNode cur1=A.next;ListNode cur2=A.next;ListNode head=A;head.next=null;while(cur1!=null){cur2=cur1.next;cur1.next=head;head=cur1;cur1=cur2;}while(A!=null){if(A.val!=head.val){return false;}A=A.next;head=head.next;}return true;}
}

三、链表的中间节点

题目描述:

链接: 链表的中间节点

52df901407e04f78afeb34a52a34d5b9.png

题目分析:

我们可以用快慢指针的方法,定义一个快指针fast每次走两步,再定义一个慢指针每次走一步,这样在快指针遍历完链表时,慢指针就正好位于中间位置了

注意:链表的长度可能是奇数也可能是偶数,当结点数为奇数时,fast是走不到最后一个的,如果强行每次都走两步的话最后会出现空指针异常,不过仔细观察你会发现,当fast走到倒数第二位时,slow就刚好位于中间结点了,因此我们只要改变一下循环退出条件即可

代码实现:

class Solution {public ListNode middleNode(ListNode head) {ListNode cur1=head;ListNode cur2=head;while(cur1 !=null&&cur1.next!=null){cur1=cur1.next.next;cur2=cur2.next;}return cur2;}
}

 

四、相交节点

题目描述:

链接:相交节点

d5e2d95c48bd4b1aa612c11944789f5c.png

 

题目分析:

        如果两个链表等长的情况下,这题就非常简单了,只需要同时让指针a、b分别从两个链表的头结点出发,判断是否有结点相等即可,但显然,两个链表的长度未必是相等的。

        这时我们可以先让指针a、b分别遍历两个链表,直到有一个链表被遍历完后,这时长链表指针与长链表尾结点的距离正好是两个链表长度的差值,这时再令一指针x指向长链表的头结点,再一次让之前没遍历完的指针y与新指针x进行遍历,直到老指针y指向长链表的尾结点,这时x与长链表的尾结点的距离正好等于短链表的长度,接着就可以用处理两个等长链表的方式来处理了


代码实现:

public class Solution {if(headA==null&&headB==null)return null;ListNode cur1=headA;ListNode cur2=headB;while(cur1!=null&&cur2!=null){cur1=cur1.next;cur2=cur2.next;}if(cur1==null){cur1=headB;}else{cur2=headA;}while(cur1!=null&&cur2!=null){cur1=cur1.next;cur2=cur2.next;}if(cur1==null){cur1=headB;}else{cur2=headA;}while(cur1!=null&&cur2!=null){if(cur1==cur2){return cur1;}cur1=cur1.next;cur2=cur2.next;}return null;}

 

 

五、返回倒数第k个节点

题目描述:

链接:返回倒数第k个节点

ba9d2323bd824f7f842222b741a418a8.png

题目分析:

我们可以定义两个指针,先让指针1遍历链表,同时记录指针走过的步数s,当s=k时,开始让指针2从头结点开始遍历链表,当指针1指向链表的尾结点时,指针2所指向的结点就是倒数第k个结点了

注意:可能出现k值大于链表长度或k值小于零的情况,

当k<0时,题目显然是无解的,直接return-1即可

当k大于链表长度时,我们可以通过记录指针1走过的步数s的大小来判断,如果指针1遍历完链表时,s任小于k,就说明k值超过了链表的长度,直接return -1即可


代码实现:

public class Solution {public int kthToLast(ListNode head, int k) {if (k < 0) {return -1;}ListNode cur1=head;ListNode cur2=head;int s=0;while(cur1!=null){cur1=cur1.next;if(s==k){cur2=cur2.next;}else{s++;}}if(s<k){return -1;}else{return cur2.val;}}
}

 

总结

那么本篇文章就到此为止了,如果觉得这篇文章对你有帮助的话,可以点一下关注和点赞来支持作者哦。作者还是一个萌新,如果有什么讲的不对的地方欢迎在评论区指出,希望能够和你们一起进步✊

6d1311864a3f47b8a5ba9bb8a3f457cc.png

 

 

 

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

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

相关文章

JAVA------基础篇

java基础 1.JDK JDK :java development kit JRE&#xff1a;java runtime environment JDK包含JRE java跨平台&#xff1a;因为java程序运行依赖虚拟机&#xff0c;虚拟机需要有对应操作系统的版本&#xff0c;而jre中有虚拟机。 当你想要在Linux系统下运行&#xff0c;则需要…

(数据类型)前端八股文修炼Day1

1.JavaScript有哪些数据类型&#xff0c;它们的区别 JavaScript中有以下种数据类型&#xff1a; 基本数据类型&#xff08;Primitive Data Types&#xff09;&#xff1a; String&#xff1a;表示文本数据&#xff0c;用单引号&#xff08;&#xff09;或双引号&#xff08;…

【C语言】strcmp 的使⽤和模拟实现

前言 这篇文章将要带我们去实现模拟一个strcmp函数 首先我们要知道strcmp函数的定义 strcmp()定义和用法 我们先看一下strcmp在cplusplus网站中的定义 链接: link int strcmp ( const char * str1, const char * str2 );比较两个字符串将 C 字符串 str1 与 C 字符串 str2 …

4.Python数据分析—数据分析入门知识图谱索引(知识体系下篇)

4.Python数据分析—数据分析入门知识图谱&索引-知识体系下篇 一个人简介二机器学习基础2.1 监督学习与无监督学习2.1.1 监督学习&#xff1a;2.1.2 无监督学习&#xff1a; 2.2 特征工程2.3 常用机器学习算法概述2.3.1 监督学习算法&#xff1a;2.3.2 无监督学习算法&#…

数据结构/C++:位图 布隆过滤器

数据结构/C&#xff1a;位图 & 布隆过滤器 位图实现应用 布隆过滤器实现应用 哈希表通过映射关系&#xff0c;实现了O(1)的复杂度来查找数据。相比于其它数据结构&#xff0c;哈希在实践中是一个非常重要的思想&#xff0c;本博客将介绍哈希思想的两大应用&#xff0c;位图…

jmeter常用的函数

20211025白板 课前内容&#xff1a; 参数&#xff1a; 用户定义变量&#xff1a;它是一个全局变量&#xff0c;在启动运行时&#xff0c;获取一次值&#xff0c;在运行过程中&#xff0c;不会动态获取值。 用户定义变量&#xff0c;在启动时获取一次值&#xff0c;在运行过程中…

【Flutter 面试题】 什么是Flutter插件(Plugin)?如何使用和创建插件?

【Flutter 面试题】 什么是Flutter插件&#xff08;Plugin&#xff09;&#xff1f;如何使用和创建插件&#xff1f; 文章目录 写在前面口述回答补充说明使用插件创建插件 写在前面 &#x1f64b; 关于我 &#xff0c;小雨青年 &#x1f449; CSDN博客专家&#xff0c;GitChat…

今日早报 每日精选15条新闻简报 每天一分钟 知晓天下事 3月28日,星期四

每天一分钟&#xff0c;知晓天下事&#xff01; 2024年3月28日 星期四 农历二月十九 1、 四部门&#xff1a;培育空中摆渡、私人包机等新业态&#xff0c;2030年形成万亿级市场规模。 2、 市监总局发文规范外卖营销防止浪费&#xff1a;不将主食纳入满减优惠展示范围。 3、 多…

Fortinet 核心高管团队访谈:计划在所有产品系列中引入生成式AI

近期&#xff0c;Fortinet 发布了2023 财年第四季度及全年财报&#xff0c;再创骄人业绩&#xff01;新增客户超 2.5 万&#xff0c;账单收入超 60 亿美元……对此&#xff0c;Fortinet 创始人、董事长兼首席执行官谢青&#xff08;Ken Xie&#xff09;&#xff1b;首席财务官K…

SQL104 返回产品名称和每一项产品的总订单数(left join..on.. ,group by)

select prod_name,count(order_num) as orders from Products P left join OrderItems OI on OI.prod_id P.prod_id group by prod_name order by prod_name;left join一个数据条多的表 count&#xff08;order_num&#xff09;,group by 另一个字段

前端学习<二>CSS基础——05-CSS样式表的继承性和层叠性

本文重点 CSS的继承性 CSS的层叠性 计算权重 权重问题大总结 CSS样式表的冲突的总结 权重问题深入 同一个标签&#xff0c;携带了多个类名 !important标记 CSS的继承性 我们来看下面这样的代码&#xff0c;来引入继承性&#xff1a; 上方代码中&#xff0c;我们给div标…

Ubuntu 系统下安装 Nginx

目录 一、Nginx是什么 ​二、Ubuntu 系统下安装 Nginx 1、安装包下载 2、上传服务器并解压缩 3、依赖配置安装 4、生成编译脚本 ​5、编译 6、开始安装 7、设置为随机自启动 7.1、创建 nginx.service 文件&#xff0c;将以下内容粘贴到文件中 7.2、将 nginx.service…

极简wordpress网站模板

Pithy设计师wordpress网站模板 精练简洁的wordpress模板&#xff0c;设计师或设计工作室展示型网站模板。 https://www.jianzhanpress.com/?p6329

C++哈希hash:位图、布隆过滤器的实现及应用

一、位图实现 1.1位图的原理 所谓位图&#xff0c;就是用每一位来存放某种状态&#xff0c;适用于海量数据&#xff0c;数据无重复的场景。通常是用 来判断某个数据存不存在的。 当我们想查找某一个数据是否存在或者是否处于某种状态时&#xff0c;相比于直接对存放数据的容器…

Redis是单线程还是多线程?(面试题)

1、Redis5及之前是单线程版本 2、Redis6开始引入多线程版本&#xff08;实际上是 单线程多线程 版本&#xff09; Redis6及之前版本&#xff08;单线程&#xff09; Redis5及之前的版本使用的是 单线程&#xff0c;也就是说只有一个 worker队列&#xff0c;所有的读写操作都要…

最新2024年增强现实(AR)营销指南(完整版)

AR营销是新的最好的东西&#xff0c;就像元宇宙和VR营销一样。利用AR技术开展营销活动可以带来广泛的利润优势。更不用说&#xff0c;客户也喜欢AR营销&#xff01; 如果企业使用AR&#xff0c;71%的买家会更多地购物。40%的购物者准备在他们可以在AR定制的产品上花更多的钱。…

【nodejs ubuntu】nodejs版本过老的更新方法

使用apt方法安装的node.js版本过于老了&#xff0c;以至于我没法用npm下载hexo 下面是更新方法 参考了这篇文章 然后就可以成功安装了

【计算机网络】物理层

文章目录 第二章 物理层一、 物理层的基本概念1. 物理层接口特性 二、数据通信基础1. 典型的数据通信模型2. 数据通信相关术语3. 设计数据通信系统要考虑的3个问题4. 三种通信方式5. 串行传输&并行传输6. 同步传输&异步传输7. 码元8. 数字通信系统数据传输速率的两种表…

FFmpeg拉取RTSP流并定时生成10秒短视频

生成效果: 视频时长为10秒 生成格式为FLV 输出日志: 完整实现代码如下: 需要在Mac和终端先安装FFmpeg brew install ffmpeg CMake文件配置: cmake_minimum_required(VERSION 3.27) project(ffmpeg_open_stream) set(CMAKE_CXX_STANDARD 17)#头文件包目录 include_director…

C语言牛客网BC-37 牛牛的圆(求面积)

题目如下 代码实现 #include<stdio.h> int main() { float r 0;float s 0;scanf("%f",&r);s 3.14*r*r;printf("%.2f",s);return 0; } 创作不易&#xff0c;点点关注&#xff0c;感谢支持&#xff01;&#xff01;&#xff01;