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

news2024/9/28 9:27:26

 

一、链表分割

题目描述:

链接:链表分割

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 here
        if(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 here
        if(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.coloradmin.cn/o/1550979.html

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

相关文章

FKSS型煤层注水封孔器向光而行

要保持自己喜欢的样子 不要随波逐流 也不要过度失落 温柔的人 会有一个好的结局 结构特点 封孔器是由注水喷头、固定螺母管芯、单向阀、膨胀胶管、扣压外套、扣压芯子、注水连接体组成。 水分注入煤体&#xff0c;能湿润和破碎煤体&#xff0c;释放部分瓦斯&#xff0c;降低煤…

TreeMap集合 -java学习笔记

TreeMap TreeMap (由键决定特点):按照键的大小默认升序排序、不重复、无索引特点:不重复、无索引、可排序(按照键的大小默认升序排序&#xff0c;只能对键排序&#xff09;原理:TreeMap跟TreeSet集合的底层原理是一样的&#xff0c;都是基于红黑树实现的排序 TreeSet&#xff…

zabbix分布式部署

基于zabbix-proxy的分布式监控 1.1 分布式监控的作用 1&#xff09;分担 server 的集中式压力&#xff1b; 2&#xff09;解决多机房之间的网络延时问题。 1.2 数据流向 agent --> proxy --> server 1.3 构成组件 zabbix-server&#xff1a;整个监控体系中最核心的组…

Mudbox 2025新版中文---数字雕刻与纹理绘画新境界

Mudbox 2025是一款功能强大的3D建模软件&#xff0c;以其卓越的建模能力和高效的创作工具而备受瞩目。它支持纹理烘烤、三维层、多分辨率网格编辑等功能&#xff0c;为用户提供了直观且易于操作的用户界面。 Mudbox 2025新版中文下载 功能特色&#xff1a; 强大的建模与雕刻能…

PaddleOCR环境搭建、模型训练、推理、部署全流程(Ubuntu系统)

OCR场景应用集合&#xff1a;包含数码管、液晶屏、车牌、高精度SVTR模型、手写体识别等9个垂类模型&#xff0c;覆盖通用&#xff0c;制造、金融、交通行业的主要OCR垂类应用。 ​ 一、PaddleOCR环境搭建 ​ conda create -n ppocr python3.8​conda activate ppocr 进入paddle…

如何在Windows通过eXtplorer结合cpolar搭建个人文件服务器并实现无公网ip远程访问

文章目录 1. 前言2. eXtplorer网站搭建2.1 eXtplorer下载和安装2.2 eXtplorer网页测试2.3 cpolar的安装和注册 3.本地网页发布3.1.Cpolar云端设置3.2.Cpolar本地设置 4.公网访问测试5.结语 1. 前言 通过互联网传输文件&#xff0c;是互联网最重要的应用之一&#xff0c;无论是…

一文教你学会用群晖NAS配置WebDAV服务结合内网穿透实现公网同步Zotero文献库

文章目录 前言1. Docker 部署 Trfɪk2. 本地访问traefik测试3. Linux 安装cpolar4. 配置Traefik公网访问地址5. 公网远程访问Traefik6. 固定Traefik公网地址 前言 Trfɪk 是一个云原生的新型的 HTTP 反向代理、负载均衡软件&#xff0c;能轻易的部署微服务。它支持多种后端 (D…

Nuxt3(路由)

说明 Nuxt的核心功能之一是文件系统路由。pages/目录中的每个Vue文件都会创建一个相应的URL&#xff08;或路由&#xff09;&#xff0c;用于显示文件的内容。通过为每个页面使用动态导入&#xff0c;Nuxt利用代码分割来仅加载所需路由的最小量JavaScript。 简单来说&#xf…

金三银四-探秘银行科技部:稳定职业背后的挑战 | 不敢跳槽啦 | 好慌

小伙伴们好&#xff0c;我是「 行走的程序喵」&#xff0c;感谢您阅读本文&#xff0c;欢迎三连~ &#x1f63b; 【Java基础】专栏&#xff0c;Java基础知识全面详解&#xff1a;&#x1f449;点击直达 &#x1f431; 【Mybatis框架】专栏&#xff0c;入门到基于XML的配置、以…

【Java程序设计】【C00344】基于Springboot的船舶维保管理系统(有论文)

基于Springboot的船舶维保管理系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 项目获取 &#x1f345;文末点击卡片获取源码&#x1f345; 开发环境 运行环境&#xff1a;推荐jdk1.8&#xff1b; 开发工具&#xff1a;eclipse以及i…

印度尼西亚国家出口发展局局长一行莅临锐捷网络,共话数字经济未来

第四届中国跨境电商交易会举办期间,印度尼西亚国家出口发展局局长迪迪苏梅迪一行莅临锐捷网络参观交流,宣传推介印度尼西亚市场资源,挖掘中印尼双方企业合作机遇。福州市商务局副局长潘文等领导共同参与活动。锐捷网络副总裁、数据中心事业部总经理林东豪接待。 印度尼西亚国家…

T-Mobile紫卡激活(Ultra)

https://my.ultramobile.com/paygo/activation 人工智能学习网站&#xff1a; https://chat.xutongbao.top

Nginx 编译安装【CentOS 7】

1. 前言 本文使用的操作系统&#xff1a; 名称描述Oracle VM VirtualBox虚拟机软件CentOS-7-x86_64-Minimal-2009.isoCentOS 7.9 最小化安装镜像文件 操作系统信息如下所示 cat /etc/redhat-release 2. 源码包 进入 nginx 官网&#xff1a;https://nginx.org&#xff0c;查看…

MySQL B树 和B+数据的区别

MySQL B树 和B数据的区别 树分类&#xff1a;二叉树完全二叉树满二叉树堆红黑树 B树B树 首先我们搞清楚数据结构中的 树这个概念 树 分类&#xff1a; 二叉树 限定每个节点的子节点最多只有2个子节点&#xff0c;且有左右之分。完全二叉树 满二叉树 堆 红黑树 B树 B树 …

深度学习故障诊断实战 | 数据预处理之基于滑动窗的数据样本增强

前言 本期给大家分享介绍如何基于滑动窗方法进行数据样本增强 背景 深度学习模型训练需要大量的样本。在故障诊断领域&#xff0c;每个类别大都会达到300个样本。但是在实际公开数据集中&#xff0c;以CWRU数据集为例&#xff0c;每个类别只有24组数据&#xff0c;这明显是不…

拓扑排序_和邻接表

首先认识邻接表,两种写法一种原始写法相当复杂,一种二维vector写法稍简单,邻接表,意思就是,该节点的下一个节点有哪些. 首先来看原始写法,记住下面这张图 可以看到这就是原始的邻接表,我们需要三个数组,终点数组e[],上一条边的索引位置fr[],和辅助数组h[],h[i]表示上一条i为起…

【面试经典150 | 】最长递增子序列

文章目录 Tag题目来源解题思路方法一&#xff1a;动态规划 写在最后 Tag 【动态规划】【数组】 题目来源 300. 最长递增子序列 解题思路 方法一&#xff1a;动态规划 定义状态 dp[i] 表示以位置 i 对应整数为末尾的最长递增子序列的长度。 状态转移 我们从小到大计算 dp…

SpringBoot实现RabbitMQ的简单队列(SpringAMQP 实现简单队列)

文章目录 1. 前言2. Basic Queue 简单队列模型2.1 父工程导入依赖2.2 消息发送2.2.1 消息发送方必要的配置2.2.2 发消息 3. 消息接收3.1 消息接收方必要的配置3.2 接收消息 1. 前言 SpringAMQP 是基于 RabbitMQ 封装的一套模板&#xff0c;并且还利用 SpringBoot 对其实现了自…

【教程】iOS 手机抓包工具介绍及教程

&#x1f4f1; 最近又发现APP Store一款宝藏软件&#xff0c;克魔助手抓包工具&#xff0c;app刚上架&#xff0c;功能不断迭代中&#xff0c;目前18软妹币实惠价可享受终身版&#xff01;现在是下手的最好时机。 引言 移动端开发中&#xff0c;抓包工具已成为必备的工具之一…

数据库 05-05 优化

01.查询优化的概念 02.例子&#xff1a;优化关系代数 转换关系代数&#xff1a; 03.优化查询执行计划 04.这些都是查询优化器&#xff0c;详细介绍&#xff1a; 一. 等价表达式 等价规则&#xff1a; 01. 02. 03. 04. E1 X E2 是全部笛卡尔积 什么是自然连…