【牛客网面试必刷TOP101】链表篇(二)

news2024/11/17 1:54:27

【牛客网面试必刷TOP101】链表篇(二)

  • 前言
  • 刷题网站
  • 刷题!
    • BM4 合并两个排序的链表
      • 思路一:双指针
      • 思路二:递归(扩展思路)
    • BM5 合并k个已排序的链表
      • 思路一:归并排序思想
    • BM6 判断链表中是否有环
      • 思路一:双指针
  • 总结

前言

链表是数据结构中重要的一个章节,他的重要性也不言而喻
面试都会遇到这类的题目,以下是链表的常考的题目。

刷题网站

https://www.nowcoder.com/activity/oj
在这里插入图片描述

刷题!

BM4 合并两个排序的链表

https://www.nowcoder.com/share/jump/6243324481684295523891
在这里插入图片描述

思路一:双指针

step 1:判断空链表的情况,只要有一个链表为空,那答案必定就是另一个链表了,就算另一个链表也为空。
step2:新建一个空的表头后面连接两个链表排序后的节点,两个指针分别指向两链表头。
step3:遍历两个链表都不为空的情况,取较小值添加在新的链表后面,每次只把被添加的链表的指针后移。
step4:遍历到最后肯定有一个链表还有剩余的节点,它们的值将大于前面所有的,直接连在新的链表后面即可。

public class Solution {
        public ListNode Merge(ListNode list1,ListNode list2) {
            //一个已经为空了,直接返回另一个
            if(list1 == null)
                return list2;
            if(list2 == null)
                return list1;
            //加一个表头
            ListNode head = new ListNode(0);
            ListNode cur = head;
            //两个链表都要不为空
            while(list1 != null && list2 != null){
                //取较小值的节点
                if(list1.val <= list2.val){
                    cur.next = list1;
                    //只移动取值的指针
                    list1 = list1.next;
                }else{
                    cur.next = list2;
                    //只移动取值的指针
                    list2 = list2.next;
                }
                //指针后移
                cur = cur.next;
            }
            //哪个链表还有剩,直接连在后面
            if(list1 != null)
                cur.next = list1;
            else
                cur.next = list2;
            //返回值去掉表头
            return head.next;
        }
    }

思路二:递归(扩展思路)

step 1:每次比较两个链表当前节点的值,然后取较小值的链表指针往后,另一个不变,两段子链表作为新的链表送入递归中。
step2:递归回来的结果我们要加在当前较小值的节点后面,相当于不断在较小值后面添加节点。
step 3:递归的终止是两个链表有一个为空。

 public ListNode Merge(ListNode list1,ListNode list2) {
        //当一个已经为空,则返回另一个
        if(list1==null){
            return list2;
        }
        if(list2==null){
            return list1;
        }
        //先放较小的值节点
        if(list1.val<=list2.val){
            //递归往下
            list1.next=Merge(list1.next,list2);
            return list1;
        }else{
            //递归往下
            list2.next=Merge(list1,list2.next);
            return list2;
        }
    }

BM5 合并k个已排序的链表

https://www.nowcoder.com/share/jump/6243324481684295501744
在这里插入图片描述

思路一:归并排序思想

分治:分治即“分而治之”,“分”指的是将一个大而复杂的问题划分成多个性质相同但是规模更小的子问题,子问题继续按照这样划分,直到问题可以被轻易解决;
“治”指的是将子问题单独进行处理。
经过分治后的子问题,需要将解进行合并才能得到原问题的解,因此整个分治过程经常用递归来实现。

step 1:从链表数组的首和尾开始,每次划分从中间开始划分,划分成两半,得到左边n/2个链表和右边n/2个链表。
step 2:继续不断递归划分,直到每部分链表数为1。
step3:将划分好的相邻两部分链表,按照两个有序链表合并的方式合并,合并好的两部分继续往上合并,直到最终合并成一个链表。

//合并两个链表
    public class Solution {
        public ListNode Merge(ListNode list1,ListNode list2){
            if(list1==null){
                return list2;
            }
            if(list2==null){
                return list1;
            }
            //加表头
            ListNode head=new ListNode(0);
            ListNode cur=head;
            while(list1!=null&&list2!=null){
                if(list1.val<=list2.val){
                    cur.next=list1;
                    list1=list1.next;
                }
                else{
                    cur.next=list2;
                    list2=list2.next;
                }
                cur=cur.next;
            }
            //哪个表有剩,加后面
            if(list1!=null){
                cur.next=list1;
            }else{
                cur.next=list2;
            }
            return head.next;
        }

        //划分合并区间
        ListNode divideMerge(ArrayList<ListNode> lists,int left,int right){
            if(left>right){
                return null;
            }else if(left==right){
                return lists.get(left);
            }
            int mid=(left+right)/2;
            //不断递归。直到每部分链表个数为1
            return Merge(divideMerge(lists, left, mid), divideMerge(lists, mid + 1, right));
        }

        //最后合并每个数
        public ListNode mergeKLists(ArrayList<ListNode> lists) {
            //将每个数排序并合并
            return divideMerge(lists,0,lists.size()-1);
        }
    }

BM6 判断链表中是否有环

https://www.nowcoder.com/share/jump/6243324481684295413149
在这里插入图片描述

思路一:双指针

我们可以用双指针技巧,同向访问的双指针,速度是快慢的,只要有环,二者就会在环内不断循环,且因为有速度差异,二者一定会相遇。

step 1:设置快慢两个指针,初始都指向链表头。
step 2:遍历链表,快指针每次走两步,慢指针每次走一步。
step3:如果快指针到了链表末尾,说明没有环,因为它每次走两步,所以要验证连续两步是否为NULL。
step4:如果链表有环,那快慢双指针会在环内循环,因为快指针每次走两步,因此快指针会在环内追到慢指针,二者相遇就代表有环。

在这里插入图片描述

public class Solution {
        public boolean hasCycle(ListNode head) {
            //先判断链表为空的情况
            if(head == null)
                return false;
            //快慢双指针
            ListNode fast = head;
            ListNode slow = head;
            //如果没环快指针会先到链表尾
            while(fast != null && fast.next != null){
                //快指针移动两步
                fast = fast.next.next;
                //慢指针移动一步
                slow = slow.next;
                //相遇则有环
                if(fast == slow)
                    return true;
            }
            //到末尾则没有环
            return false;
        }
    }

总结

链表题中要想到判断是否为空链表,要考虑特殊情况!

💓感谢阅读!

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

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

相关文章

内网渗透(七十九)之 CVE-2021-42287 权限提升漏洞

CVE-2021-42287 权限提升漏洞 漏洞背景 2021年11月9日,微软发布11月份安全补丁更新。在该安全补丁更新中,修复了两个域内权限提升漏洞CVE-2021-42287 、CVE-2021-42278。当时这两个漏洞的利用详情和POC并未公布,因此并未受到太多人关注。 一个月后,国外安全研究员公布了…

[CTF/网络安全] 攻防世界 ics-06 解题详析

[CTF/网络安全] 攻防世界 ics-06 解题详析 姿势&#xff08;Burp爆破&#xff09; 题目描述&#xff1a;云平台报表中心收集了设备管理基础服务的数据&#xff0c;但是数据被删除了&#xff0c;只有一处留下了入侵者的痕迹。 可知&#xff1a;报表中心含有部分数据 仅报表中心…

C++内存管理/函数模板/类模板

一、C内存管理 C中内存基本形式与C语言类似&#xff0c;可以参考下图。 X64环境下总共大小为8G,X86环境下为4G。 1、内核空间&#xff1a;用户不能读写&#xff0c;但要占用一定空间。 2、栈区&#xff1a;以开辟、销毁栈帧形式运行&#xff0c;主要应用于局部变量和函数栈帧…

chatgpt赋能Python-python3_choice

Python3中的choice()函数&#xff1a;一种简单而有趣的随机选择方式 在Python3中&#xff0c;choice()函数是一个常见的随机模块。它允许我们从一个序列中随机选择一个元素。这在程序中经常用于生成一些需要随机展示的数据。本文将介绍Python3中的choice()函数&#xff0c;并探…

00.SpringCloud服务调用方式

服务调用方式 RPC和HTTP 无论是微服务还是SOA&#xff0c;都面临着服务间的远程调用。那么服务间的远程调用方式有哪些呢&#xff1f; 常见的远程调用方式有以下2种&#xff1a; RPC&#xff1a;Remote Produce Call远程过程调用&#xff0c;类似的还有 。自定义数据格式&am…

合合信息亮相CCIG2023:多位大咖共话智能文档未来,文档图像内容安全还面临哪些技术难题?

近日&#xff0c;中国图象图形大会&#xff08;CCIG 2023&#xff09;&#xff08;简称“大会”&#xff09;在苏州圆满落幕。本届大会以“图象图形向未来”为主题&#xff0c;由中国科学技术协会指导&#xff0c;中国图象图形学学会主办&#xff0c;苏州科技大学承办&#xff…

干货 | 利用SPSS进行高级统计第一期(更新)

Hello&#xff0c;大家好&#xff01; 这里是壹脑云科研圈&#xff0c;我是喵君姐姐~ 在之前的文章中&#xff0c;我们以此介绍了如何利用SPSS进行高级统计分析&#xff0c;内容包括&#xff1a; (1)描述性统计表格模板、卡方&T检验、相关&回归分析 (2)中介、多重中…

MD5_buuctf

概念 MD5信息摘要算法&#xff0c;一种被广泛使用的密码散列函数&#xff0c;可以产生出一个128位&#xff08;16字节&#xff09;的散列值&#xff08;hash value&#xff09;&#xff0c;用于确保信息传输完整一致。 MD5算法具有以下特点&#xff1a; 压缩性&#xff1a;任意…

一次失败的面试经历:我只想找个工作,你却看不起我?还用面试题羞辱我...

这段时间都说难找工作&#xff0c;没有面试机会。面对如此严峻的形式&#xff0c;很多软件测试人员都希望能拿一个满意的高薪offer&#xff0c;但是随着招聘职位的不断增多&#xff0c;面试的难度也随之加大&#xff0c;而面试官更是会择优录取 我最近为面试已经焦头烂额了&am…

循坏队列+OJ题之设计循环队列

生命不是要等待风暴过去&#xff0c;而是要学会在风暴中跳舞。 ——卡莉尔吉布朗目录 &#x1f33a;前言&#xff1a; &#x1f341;一.循环队列是什么&#xff1f; &#x1f34f;二.循环队列有什么作用&#xff1f; &#x1f340;三.OJ题之设计循环队列 1…

C++(3):字符串、向量和数组

命名空间的 using 声明 using namespace::name;1.每个名字都需要独立的 using 声明&#xff1b; 2.头文件不应包含 using 声明&#xff1a; 因为头文件的内容会拷贝到所有引用它的文件中去&#xff0c;如果头文件里有某个using声明&#xff0c;那么每个使用了该头文件的文件就…

Apache Kafka - 重识Kafka生产者

文章目录 概述Kafka 生产者Kafka 生产者工作原理如何使用 Kafka 生产者 生产者配置项&#xff08;核心&#xff09;导图总结 概述 Kafka 生产者是 Apache Kafka 中的一个重要组件&#xff0c;它负责将数据发送到 Kafka 集群中。在实时数据处理和流式处理应用程序中&#xff0c…

如何自建个人音乐播放器Navidrome

文章目录 1. 前言2. Navidrome网站搭建2.1 Navidrome下载和安装2.1.1 安装并添加ffmpeg2.1.2下载并配置Navidrome2.1.3 添加Navidrome到系统服务 2.2. Navidrome网页测试 3. 本地网页发布3.1 cpolar的安装和注册3.2 Cpolar云端设置3.3 Cpolar本地设置 4. 公网访问测试5. 结语 转…

【总结】Nupmy1

Nupmy numpy的核心是名为ndarray的数据类型&#xff0c;它代表多维数组&#xff0c;封装了操作数据的运算和方法 1. 创建数组对象 1.1 方法1:array 通过array将list转换成数据对象 # 通过array将list转换成数据对象 array1np.array([1,2,3,4,5]) array1 # array([1, 2, 3,…

Nginx + fastCGI 实现动态网页部署

简介 本文章主要介绍下&#xff0c;如何通过Nginx fastCGI来部署动态网页。 CGI介绍 在介绍fastCGI之前先介绍下CGI是什么。CGI : Common Gateway Interface&#xff0c;公共网关接口。在物理层面上是一段程序&#xff0c;运行在服务器上&#xff0c;提供同客户端HTML页面的…

测试理论----Bug的严重程度(Severity)和优先级(Priority)的分类

【原文链接】测试理论----Bug的严重程度&#xff08;Severity&#xff09;和优先级&#xff08;Priority&#xff09;的分类 一、Bug的严重程度&#xff08;Severity&#xff09; Bug的Severity&#xff08;严重程度&#xff09;指的是一个Bug对软件系统功能影响的程度&#…

Java常用工具之Collections

目录 一、排序操作二、查找操作三、同步控制三、不可变集合四、其他五、CollectionUtils&#xff1a;Spring 和 Apache 都有提供的集合工具类六 、小结 Collections 是 JDK 提供的一个工具类&#xff0c;位于 java.util 包下&#xff0c;提供了一系列的静态方法&#xff0c;方便…

2023河海大学846软件工程学硕考研高分上岸经验分享

大家好&#xff0c;我是陪你考研每一天的大巴学长。 大巴学长为大家邀请到了2023年846软件工程学硕刚刚上岸的学长&#xff0c;为大家分享一下他的考研经验&#xff0c;经验里详细介绍了各科的复习方法&#xff0c;很有参考意义。 希望对大家有所借鉴和帮助&#xff0c;在此向…

栈实现队列(继续细起来啊)

生命不是要等待风暴过去&#xff0c;而是要学会在风暴中跳舞。 ——卡莉尔吉布朗目录 &#x1f341;一.栈实现队列 &#x1f340;二.使用两个栈实现队列的功能 &#x1f33c;1.在队列的结构体中创建两个栈 &#x1f681;2.创建一个队列的结构体指针 &#x1f309;3…

云计算中的大数据处理:尝试HDFS和MapReduce的应用

云计算中的大数据处理&#xff1a;尝试HDFS和MapReduce的应用 文章目录 云计算中的大数据处理&#xff1a;尝试HDFS和MapReduce的应用一、前言二、第一题1、命令方式2、java API方式 三、第二题1、创建CSV文件并将其上传到HDFS2、编写利用MapReduce框架的java代码3、打包java项…