LeetCode链表题(中等)剖析

news2024/12/22 1:23:45

文章目录

  • 💐文章导读
  • 💐1.合并零之间的结点
    • 解题思路
  • 💐2.链表中最大孪生和
    • 解题思路
  • 💐3.链表的随机节点
    • 解题思路
  • 💐4.复杂链表的复制
    • 解题思路
  • 💐5.两辆交换两表中的节点
    • 解题思路

💐文章导读

🤴文章作者:💐噢!刺激
本篇文章主要对5道LeetCode上链表中等的题做了一下分析,欢迎大家知错,本篇文章收于专栏;💐图解LeetCode
🏆文章专栏:💖JavaSE语法、💖图解LeetCode、💖数据结构剖析

💐1.合并零之间的结点

在这里插入图片描述

解题思路

解题思路:

1、想要把零之间的节点值全部加起来并且把所有的零节点都删除掉,肯定是需要知道头节点的位置的,所以定义head1用来记录头节点的位置

2、记录好头节点位置后,在定义一个cur来遍历所有的节点,再用一个变量sum来专门对值不是0的节点进行相加,

3、当cur遍历到值是0的节点时,就停止遍历,将head1所在的节点中的值设置为sum,再将里面所存的地址变为cur里面存的下一个 节点的地址,这样就把一小段两个0之间的不为0的节点和最后一个0节点给删除掉了,之后cur向后移动一个结点,把head1在移到cur的位置,这样就又开始一小段节点的遍历。

4、直到cur走完这个链表,循环终止

public ListNode mergeNodes(ListNode head) {
        ListNode cur = head.next;
        ListNode head1 = head;
        int sum = 0;
        while(cur != null){
        while(cur.val != 0) {
            sum+=cur.val;
            cur = cur.next;
        }
        if(cur != null) {
            head1.val = sum;
            head1.next = cur.next;
            cur = cur.next;
            head1 = cur;
            sum = 0;
        }
        }
        return head;
    }

💐2.链表中最大孪生和

在这里插入图片描述

解题思路

第一种解题方法:

这一道题不用返回节点,只是单纯的找最大值,所以可以把这一道题转化成顺序表来做。先把这个节点里的值都加入到顺序表中,顺便记录一下有多少个值,之后就简单了,根据题目要求就是对顺序表中的值进行访问了,最后找出最大值!

 public int pairSum(ListNode head) {
        List<Integer> list = new ArrayList<>();
        ListNode cur = head;
        int count = 0;
     //将节点中的值假如到顺序表中
        while(cur != null) {
            list.add(cur.val);
            cur = cur.next;
            //计算有多少个节点
            count++;
        }
        int result = 0;
        for(int i = 0; i <= count/2-1; i++) {
            //找出i下标所对应的值加上它的孪生值
            int c = list.get(i) + list.get(count-1-i);
            //比较
            result = Math.max(result,c);
        }
        return result;
    }

💐3.链表的随机节点

在这里插入图片描述

解题思路

解题思路:

第一种方法:利用顺序表存储每一个值

利用顺序表存储所有的节点值,然后随机在顺序表中选择一个节点值,这样的方法比较花费内存,因为在存储所有节点时,要遍历所有的节点,假设有n个节点的话,所以初始化时,时间复杂度为O(n),随机选择时,时间复杂度为O(1),而要在顺序表中存储每个节点,所以空间复杂度也是O(n).

class Solution {
    List<Integer> list;
    Random random;
    public Solution(ListNode head) {
        //用一个顺序表来记录链表里的值
         list = new ArrayList();
        while(head != null) {
            list.add(head.val);
            head = head.next;
        }
         random = new Random();
    }
    
    public int getRandom() {
        //生成随机数
        int x = random.nextInt(list.size());
        return list.get(x);
    }
}

第二种方法:蓄水池抽样算法:

因为题目要求是随机抽取一个节点,而每个节点的概率都必须相等,所以遍历每个节点,当遍历第一个节点时,生成[0,1)的随机数,第一个节点被选中的概率就是1/1;第一个节点一定会被选中,所以先将答案值设置成第一个节点的值,当遍历第二个节点时,生成[0,2)的随机数,所以前两个节点被选中的概率分别是1/2;当遍历到第三个节点时,生成[0,3)之间的随机数,所以前三个节点每个节点被选中的概率是1/3,而又如何知道当前的节点是否被选中呢?因为,第一个节点已经被设置成了答案值,所以,当生成的是0时,就表示当前节点被选中了,然后把答案值设置成当前节点的值,但是为什么是0呢?而不是1或者其他呢?因为,如果是1的话,当遍历第一个节点时,是不可能生成1的,就导致每个节点没选中的概率不一样,而如果是0的话,当遍历到第n个结点时,前面的每个节点被选中的概率都是1/n;

初始化时,不需要遍历所有节点,所以时间复杂度为O(1),随机抽取时,要遍历所有的节点,所以时间复杂度为O(n),而空间复杂度的话只需要存储一个值,所以是O(1)

class Solution {
    Random random;
    ListNode head;
    //初始化
    public Solution(ListNode head) {
        random = new Random();
        this.head = head;
    }
    
    public int getRandom() {
        int i = 1;
        int ans = 0;
        ListNode cur  = head;
        while(cur!= null) {
            if(random.nextInt(i)==0) {
                ans = cur.val;
            }
            i++;
            cur = cur.next;
        }
        return ans;
    }
}

💐4.复杂链表的复制

在这里插入图片描述

解题思路

解题思路:

如下图所示,创建三个节点分别插入在每个节点的后面,通过三个循环最后完成节点的复制;

第一个循环:分别将三个目标节点插入到每个节点后面

第二个循环:将目标节点中random的指向与源节点中的指向匹配

第三个循环:最后将目标节点中的next连接起来,生成一个新的链表

在这里插入图片描述

    public Node copyRandomList(Node head) {
        if(head == null) {
            return null;
        }
        for(Node cur = head; cur != null; cur = cur.next.next) {
            Node NodeNew = new Node(cur.val);
            NodeNew.next = cur.next;
            cur.next = NodeNew;
        }
        for(Node cur = head; cur != null; cur = cur.next.next) {
            Node randomNew = cur.next;
            randomNew.random = (cur.random != null) ? cur.random.next : null;
        }
        Node headNew = head.next;
        for(Node cur = head; cur != null; cur = cur.next) {
            Node newCur = cur.next;
            cur.next = cur.next.next;
            newCur.next = (newCur.next == null) ? null : newCur.next.next;
        }
        return headNew;
    }

💐5.两辆交换两表中的节点

在这里插入图片描述

解题思路

解题方法:

定义两个快慢指针,快指针比慢指针差一个节点的距离,两个指针分别向后走两个节点,然后交换两个节点中的值,这里要注意,因为是走两个节点,所以要注意越界的问题,当快指针的next等于null了时候,快指针就不要向后走了,所以就避免了越界问题

    public ListNode swapPairs(ListNode head) {
        if(head == null) {
            return null;
        }
        //定义两个快慢指针
        ListNode slow = head;
        ListNode fast = head.next;
        while(slow != null && fast!=null) {
            //交换两个值
            int x = slow.val;
            slow.val = fast.val;
            fast.val = x;
            //两指针向后走两步
            slow = slow.next.next;
            //判断快指针的next
            if(fast.next != null){
            fast = fast.next.next;
            }

        }
        return head;
    }


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

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

相关文章

【深圳触觉智能技术分享】RK3568 RK809电量计电池调试

本文基于IDO-SBC3568主板介绍说明PMIC RK809电量计的调试方法。 IDO-SBC3568-V1是一款基于RK3568的工控主板&#xff0c;采用22nm先进工艺制程&#xff0c;四核A55 CPU&#xff0c;主频高达2.0GHz&#xff0c;支持高达8GB高速LPDDR4&#xff0c;1T算力NPU &#xff0c;4K H.26…

如何在Allegro软件中快速复制走线和过孔?

在PCB设计过程中&#xff0c;快速而准确复制走线和过孔是提高设计效率和减少重复工作的关键所在&#xff0c;因此很多工程师会选择使用Allegro来复制走线和过孔&#xff0c;因为Allegro是一款功能强大且灵活的PCB设计软件&#xff0c;提供了多种工具和功能&#xff0c;自然包括…

springboot+java汽车配件销售业绩管理系统 J2EE平台技术

汽车配件销售类企业近年来得到长足发展,在市场份额不断扩大同时,如何更好地管理企业现有销售项目资源成为摆在该类企业面前的重要课题之一。本次打算开发的springboot汽车配件销售业绩管理系统的开发过程引用 J2EE平台技术,该平台中所包含的JDBC、JNDI等组件,规定访问数据库的形…

swagger页面 doc.html出不来,swagger-ui/index.html能出来

swagger页面 doc.html出不来&#xff0c;swagger-ui/index.html能出来。前前后后折腾了很久&#xff0c;jar包冲突&#xff0c;jar包版本&#xff0c;添加路径啥的都弄了&#xff0c;就是出不来。 后来全局搜索“doc.html”页面发现能出来的项目能搜到这个页面&#xff1a; 定…

大数据测试基础概念和工具

下方查看历史精选文章 重磅发布 - 自动化框架基础指南pdfv1.1大数据测试过程、策略及挑战 测试框架原理&#xff0c;构建成功的基石 在自动化测试工作之前&#xff0c;你应该知道的10条建议 在自动化测试中&#xff0c;重要的不是工具 大数据已经成为当今的热门话题&#xff0c…

提高客户转介绍率的7个方法,让你的客户成为你的推广大使!

都知道“客户转介绍”&#xff0c;是一种非常有效的商业推广方式。通过客户的口碑传播&#xff0c;我们能够吸引更多潜在客户&#xff0c;并建立起长久稳固的合作关系。 可以说&#xff0c;这种开拓客户的方法&#xff1a;耗时少、成功率高、成本低、客户较优质&#xff0c;称…

掌握Lazada、Shopee店铺运营的黄金法则:测评自养号技巧

在Lazada、Shopee这个东南亚最大的电商平台上&#xff0c;要想成功运营你的店铺并不容易。然而&#xff0c;如果你掌握了以下这些黄金法则&#xff0c;并有效地运用测评自养号的策略&#xff0c;你的店铺就有可能大幅提升销售并在竞争中脱颖而出。 1. 理解你的市场 首先&…

九耶丨阁瑞钛伦特-springmvc(三)

SpringMVC作为一种流行的Java Web框架&#xff0c;是基于Spring之上的。它提供了强大的MVC&#xff08;Model-View-Controller&#xff09;架构&#xff0c;能够快速地实现Java Web开发&#xff0c;高效地与数据交互。如何使用SpringMVC成为开发人员的首要问题。要了解SpringMV…

边缘计算盒子都有哪些规格?一文带你了解边缘计算云服务器 ECS

上一次我们详细讲述了&#xff0c;在日常生活中我们能够随时随地看到的“白色盒子”是边缘服务器 ECS&#xff0c;包括边缘服务器 ECS 具体的用途是什么&#xff0c;也为大家逐一进行了科普。 感兴趣的小伙伴欢迎阅读以往文章&#xff1a; 什么是边缘计算盒子&#xff1f;边缘计…

用代码拔高你对整型提升与unsigned,signed的理解

&#x1f929;本文作者&#xff1a;大家好&#xff0c;我是paperjie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 &#x1f970;内容专栏&#xff1a;这里是《C语言》专栏&#xff0c;笔者用重金(时间和精力)打造&#xff0c;基础知识一网打尽&#xff0c;希望可以…

Linux下通过 rm -f 删除大量文件时报错:Argument list too long

Linux下通过 rm -f 删除大量的小文件时出现类似如下错误信息&#xff1a; -bash: /bin/rm: Argument list too long 如下图所示&#xff1a; 问题原因 如果待删除文件中包含的小文件数量过多&#xff0c;通常是由于受到 shell 参数个数限制所致。 这个是Linux系统存在的限制&…

若依源码解析:代码生成ruoyi-generator

文章目录 摘要代码生成器的使用数据库连接配置数据库表设计代码生成器配置修改mybatis别名配置&#xff0c;增加对com.cyl包名的识别修改mybatis的mapper扫描包路径 代码生成代码输出模板配置 代码生成器原理模板引擎&#xff1a;Velocity使用Velocity模板引擎的一般流程模板语…

前端技术搭建贪吃蛇小游戏(内含源码)

The sand accumulates to form a pagoda ✨ 写在前面✨ 功能介绍✨ 页面搭建✨ 样式设置✨ 逻辑部分 ✨ 写在前面 上周我们实通过前端基础实现了井字游戏&#xff0c;今天还是继续按照我们原定的节奏来带领大家完成一个贪吃蛇游戏&#xff0c;功能也比较简单简单&#xff0c;也…

第四章 Text

目录 TextFontsGlyphsFont TypesThe Font DictionaryEncodings Text StateFont and SizeRendering Mode Drawing TextPositioning TextWhat’s Next Text 在本章中&#xff0c;您将学习如何在页面上绘制文本。 绘图文本是 PDF 图形中最复杂的部分&#xff0c;但它也是帮助 PDF…

【Netty】Netty中的超时处理与心跳机制(十九)

文章目录 前言一、超时监测二、IdleStateHandler类三、ReadTimeoutHandler类四、WriteTimeoutHandler类五、实现心跳机制5.1. 定义心跳处理器5.2. 定义 ChannelInitializer5.3. 编写服务器5.4. 测试 结语 前言 回顾Netty系列文章&#xff1a; Netty 概述&#xff08;一&#…

太坑了,盘点BeanUtils.copyProperties的11个小坑

我们日常开发中&#xff0c;经常涉及到DO、DTO、VO对象属性拷贝赋值&#xff0c;很容易想到org.springframework.beans.BeanUtils的copyProperties 。它会自动通过反射机制获取源对象和目标对象的属性&#xff0c;并将对应的属性值进行复制。可以减少手动编写属性复制代码的工作…

“游蛇”大规模邮件攻击针对中国用户

近半年黑客团伙频频对我国实施攻击活动。研究人员发现&#xff0c;“游蛇”黑产团伙自2022年下半年开始至今&#xff0c;针对中国用户发起了大规模电子邮件攻击活动。 黑客使用电子邮件在内的多种传播方式。 该团伙利用钓鱼邮件、伪造的电子票据下载站、虚假应用程序下载站、…

eclipse固件库生成的操作流程

一.方法介绍 有时候我们需要将某个功能模块封装成一个库&#xff0c;只留出接口供别人使用&#xff0c;那么就需要打包处理&#xff0c;eclipse是如何操作的呢&#xff1f;本文仅仅讨论我所知道的两种方式&#xff0c;倘若还有更简便的方法也非常欢迎网友补充。 1.在已有的工…

【PyQt5】使用QtDesigner创建Splitter

目录 Splitter效果演示 目前在Qt Designer无法检索到QSplitter。 实现方式&#xff1a; 1.同时选中两个需要实现splitter样式的控件&#xff0c;以QTreeWidget和QTableWidget为例&#xff1b; 2.右击–>布局–>使用分裂器&#xff08;根据需求选择水平或垂直布局&#x…

Groovy系列二 Groovy GDK

目录 Groovy中自带集合方法 sort方法对集合排序 findAll 查询所有符合条件的元素 collect 返回 一个新的list inject 强大的累计功能 each、eachWithIndex find、findIndexOf 查询符合条件的数据 any判断符合条件的数据 every查询所有条件都满足的数据 reverse将集合…