图解LeetCode链表题(中等)剖析

news2024/11/23 21:21:04

文章目录

  • 💐文章导读
  • 💐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/597038.html

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

相关文章

关于python pycharm中输出的内容不全的解决办法

控制台输出&#xff1a; 解决方案&#xff1a; pandas 库 # 显示所有列 pd.set_option(display.max_columns, None) # 显示所有行 pd.set_option(display.max_rows, None) # 设置value的显示长度 pd.set_option(max_colwidth, 100) # 设置1000列时才换行 pd.set_option…

DataFrame/字典/列表之间的相互转换

DataFrame —> 字典 参考&#xff1a;pandas关于to_dict的使用_pandas to_dict_曼珠沙华Devil的博客-CSDN博客 pandas提供了 DataFrame.to_dict() 函数&#xff0c;将DataFrame类型转化为字典类型 DataFrame.to_dict(orientdict) # orient 可省略 对于写入的orient不同…

闭包基本知识汇总

闭包基本知识汇总 一、什么是闭包&#xff1f; 闭包是指有权限访问另一个函数作用域中的变量的函数&#xff0c;在Javascript中&#xff0c;只有函数内部的子函数才能读取局部变量&#xff0c;因此可以把闭包简单理解成 “定义在一个函数内部的函数” 。所以&#xff0c;在本…

AI当道,元宇宙赛道是风口还是噱头?

一个新概念的诞生往往要经过无数次的锤炼&#xff0c;宛如一场漫长、深刻的头脑风暴。而发展到今天&#xff0c;处在风口之上&#xff0c;各行各业都急切往元宇宙概念靠拢&#xff0c;元宇宙已经与资本市场共舞。 伴随着全球多家行业巨头的布局以及元宇宙在游戏领域的率先落地…

c#快速入门(上)

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;那个传说中的man的主页 &#x1f3e0;个人专栏&#xff1a;题目解析 &#x1f30e;推荐文章&#xff1a;题目大解析2 目录 &#x1f449;&#x1f3fb; c#和c不同之处&#x1f449;&#x1f3fb;程序文件的…

华为OD机试真题 Java 实现【简单的解压缩算法】【2023Q1 200分】,附详细解题思路

一、题目描述 现需要实现一种算法&#xff0c;能将一组压缩字符串还原成原始字符串&#xff0c;还原规则如下&#xff1a; 1、字符后面加数字N&#xff0c;表示重复字符N次。例如&#xff1a;压缩内容为A3&#xff0c;表示原始字符串为AAA。 2、花括号中的字符串加数字N&…

tcpdump 抓包工具详细图文教程(上)

目录 一、tcpdump 抓包工具的基本介绍和学习基础 1.1 常用的抓包工具 1.2 tcpdump 抓包工具介绍 二、tcpdump 抓包工具使用环境和初体验 2.1 编译安装 tcpdump 2.2 抓包 三、讲解 TCP 协议报文报头 四、tcpdump 抓包工具常规过滤规则 4.1 tcpdump 的 host 和 net 过…

Flutter 又一元老离职,感谢 Tim 这些年的付出

前天在 insiders 收到 Tim Sneath 的离职邮件时感觉很震惊&#xff0c;因为他绝对是 Flutter 团队的元老级人物&#xff0c;几乎每次一次 Flutter 版本发布和社区活动都有他的身影&#xff0c;可以说他是我的 Flutter 领路人之一。 Tim 是在 2017 加入 Flutter 团队&#xff0…

SpringCloud微服务踩坑系列:UnknownContentTypeException

错误信息如下&#xff1a; org.springframework.web.client.UnknownContentTypeException: Could not extract response: no suitable HttpMessageConverter found for response type [class com.cyf.internalCommon.dto.ResponseResult] and content type [text/plain;charset…

使用WordPress提高企业敏捷性

喜欢WordPress的原因有很多&#xff1a;该平台非常适合内容管理以及控制预算。此外&#xff0c; 在 提高开发效率和简化项目管理方面&#xff0c;WordPress可以通过多种方式提供帮助。 对于任何企业业务&#xff0c;目标始终是在不影响质量的情况下更快地启动项目、发布修复和…

day3 -- select语句学习

文章目录 数据库和表的准备selectselect order byselect whereselect 高级过滤操作使用通配符进行过滤使用正则表达式进行搜索 数据库和表的准备 下载《mysql必知必会》提供的脚本用于创建样例表 cd /mnt/d/unix_dir wget https://forta.com/wp-content/uploads/books/067…

【Linux从入门到精通】进程的状态

当我们了解到进程是什么东西后&#xff0c;我们再来看看进程都会有那些状态。本篇文章会对进程的不同状态进行详解&#xff0c;希望会对你的理解有所帮助&#xff01; 文章目录 一、了解进程的不同状态 二、详解进程的不同状态 2、1 R运行状态&#xff08;running&#xff09; …

开源赋能 普惠未来|中软国际寄语 2023 开放原子全球开源峰会

中软国际作为行业领先的全球化软件与信息技术服务企业及数字化转型服务商&#xff0c;近年来积极布局开源生态&#xff08;OpenHarmony、openEuler&#xff09;、智能云、ERP、AIGC、教育科技、智能车六大赛道&#xff0c;加速业务转型创新。 中软国际为开放原子开源基金会白金…

文字环绕图片效果实现

书接上回&#xff0c;我们来讲讲如何实现“文字环绕图片”的效果吧。整体预计实现的效果如下&#xff1a; 日常杂谈 我喜欢看动漫&#xff0c;接下来的所有博客都会和我日常生活结合在一起写&#xff0c;这样感觉会让自己的博客会有温度&#xff0c;我感觉每个人都应该有自己的…

最新喜讯|易知微入选2023数字孪生解决方案提供商TOP50

近日&#xff0c;互联网周刊发布《2023数字孪生解决方案提供商TOP50》&#xff0c;杭州易知微科技有限公司在榜。 中国科学院主管的《互联网周刊》&#xff0c;创刊于1998年&#xff0c;是中国最具公信力的杂志之一&#xff0c;其颁布的榜单极具权威性与专业度&#xff0c;对产…

基于非局部图注意力网络的鲁棒三维形状分类

文章目录 Robust 3D Shape Classification via Non-local Graph Attention Network摘要本文方法Global Structure Network (GSN)Global Relationship Network (GRN)Local Feature Learning based on MLP-STNetwork Channel Fusion ModuleGlobal descriptor 实验结果 Robust 3D …

分布式锁的应用场景与分布式锁实现(四):基于MySQL实现分布式锁与分布式锁总结

分布式锁的应用场景与分布式锁实现&#xff08;三&#xff09;&#xff1a;基于Zookeeper实现分布式锁 基于MySQL实现分布式锁 ​ 不管是JVM锁还是MySQL锁&#xff0c;为了保证线程的并发安全&#xff0c;都提供了悲观独占排他锁。所以独占排他也是分布式锁的基本要求。 ​ …

在can协议的基础下编写DBC文件,然后使用该DBC文件下发can协议到底盘完整流程

目录 前言一、VectorCANdb下载及安装二、DBC文件的编写1.新建dbc文件2.建立dbc2.1根据CAN协议设置以下的signals2.2设置报文2.3建立报文与信号的关系2.4建立节点 三、编写程序使用UDP通信下发can协议1.查看can口、电脑ip以及端口号2.编写测试程序 前言 最近完成了一个项目&…

热烈庆祝兴业法拍网与宁波银行北京分行签订“法拍贷”业务合作

6月1日&#xff0c;兴业法拍网与宁波银行北京分行签订“法拍贷”合作协议。 “法拍贷”是以法院房产拍卖为核心、线上平台拓宽拍卖渠道、保险公司提供阶段性保证、公证机构加大司法效力、银行提供全程金融服务的“14”创新合作模式。该模式汇聚五方合力让更多竞拍人享受到便利…

2天时间3个面试,百度进了3面!

昨天和朋友复盘了一下最近的面试经历&#xff0c;分享给大家&#xff1a; 关于就业环境 忠告&#xff1a;如果不是在二三线买车买房结婚生子了&#xff0c;还是到一线城市去吧。 或者换个行业&#xff01; 关于焦虑和摆烂 如果你也在焦虑迷茫、精神内耗。找阳哥给你做“心理…