第二期:链表经典例题(两数相加,删除链表倒数第N个节点,合并两个有序列表)

news2024/11/22 15:38:41

第二期
每道题后都有解析帮助你分析做题,答案在最下面,关注博主每天持续更新。
PS:每道题解题方法不唯一,欢迎讨论!

1.两数相加

题目描述
给你两个非空的链表,表示两个非负的整数。它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储一位数字。
这两个数都不会以 0 开头。
请你将两个数相加,并以相同形式返回一个表示和的链表。
示例
输入: l1 = [1,2,3], l2 = [4,5,6] 输出:[4,7,9]
输入:l1 = [1,2],l2 = [9] 输出:[0,3]
解析
由于链表数字是逆序方式存储的,所以两个链表对应节点值可以相加,将它放入新的链表中。
但由于每个节点只能储存一位数字,所以两个节点相加的值放入时需要(l1.val + v2.val) % 10,创建一个变量carry = (v1.val + l2.val) / 10接受进位值。
在进行下面节点的时候,carry参与运算,放入新链表的值就变成(l1.val + l2.val + carry) % 10, carry = (l2.val + l1.val + carry) / 10。
如果两个链表的长度不同,则可以认为长度短的链表的后面有若干个
0。
此外,如果链表遍历结束后,有carry > 0,新链表的需要在添加一个值为carry的节点。

2. 删除链表倒数第N个节点

题目描述
给你一个链表,删除链表倒数第N个节点,并返回链表头节点。
示例
输入: head = [1,2,3,4,5],n = 3 输出: [1,2,4,5]
输入: head = [1,2,3],n = 3 输出: [2,3]
输入: head = [ 1 ],n = 1 输出: []
解析
不知道你们看到这道题第一想法是什么,我的第一想法就是前后双指针,使用两个指针fast和slow一前一后遍历。
由于要删除倒数第n个节点,所以fast先遍历,当fast比slow快n个节点时,两个指针同时遍历链表。
当fast指针的下一个节点为null时,slow指针的下个节点刚好是要删除的节点,这个时候只需要将slow.next指向slow.next.next即可。
注意一些特殊情况,当fast指针先走时,fast为null时,说明删除节点不存在,返回null;当fast先走完时,fast为null,说明删除节点为头节点,直接返回头节点的下一个节点。

3. 合并两个有序列表

题目描述
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例
输入:l1 = [1,3,5], l2 = [1,4,5] 输出:[1,1,3,4,5,5]
输入:l1 = [], l2 = [] 输出:[]
输入:l1 = [], l2 = [1] 输出:[1]
解析
这题可以使用递归,也可以迭代,就是遍历两个链表,一个一个比较。
这里我介绍一下递归:
如果 l1 或者 l2 一开始就是空链表 ,那么没有任何操作需要合并,所以我们只需要返回非空链表。否则,我们要判断 l1 和 l2 哪一个链表的头节点的值更小,然后递归地决定下一个添加到结果里的节点,如l1.val < l2.val; l1.next = mergeTwoLists(l1.next,l2);如果两个链表有一个为空,递归结束。

答案

1. 两数相加

> public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode head = new ListNode(0);
        ListNode cur = head;
        int count = 0;
        while(l1 != null && l2 != null){
            cur.next = new ListNode(((l1.val + l2.val + count) % 10));
            count = (l1.val + l2.val + count) / 10;
            cur = cur.next;
            l1 = l1.next;
            l2 = l2.next;
        }
        while(l1 != null){
            cur.next = new ListNode((l1.val + count) % 10);
            count = (l1.val + count) / 10;
            cur = cur.next;
            l1 = l1.next;
        }
        while(l2 != null){
            cur.next = new ListNode((l2.val + count) % 10);
            count = (l2.val + count) / 10;
            cur = cur.next;
            l2 = l2.next;
        }
        if(count > 0){
            cur.next = new ListNode(count);
        }
        return head.next;
    }

2. 删除链表倒数第N个节点

    public ListNode removeNthFromEnd(ListNode head, int n) {
        ListNode slow = head;
        ListNode fast = head;
        for(int i = 0;i < n; i++){
            if(fast == null){
                return null;
            }
            fast = fast.next;
        }
        if(fast == null){
            return head.next;
        }
        while(fast.next != null){
            fast = fast.next;
            slow = slow.next;
        }
        slow.next = slow.next.next;
        return head;
    }

3.合并两个有序列表

    public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
        if(list1 == null){
            return list2;
        }else if(list2 == null){
            return list1;
        }else{
            if(list1.val < list2.val){
                list1.next = mergeTwoLists(list1.next,list2);
                return list1;
            }else{
                list2.next = mergeTwoLists(list1,list2.next);
                return list2;
            }
        }
    }

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

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

相关文章

【Vue】二:Vue核心处理---模板语法

文章目录 1.模板语法---插值2.模板语法---指令语法2.1v-once2.2 v-bind2.3 v-model2.4 v-on 3.MVVM4.事件回调函数中的this 1.模板语法—插值 {{可以写什么}} &#xff08;1&#xff09;在data中声明的变量&#xff0c;函数 &#xff08;2&#xff09;常量 &#xff08;3&…

【蓝桥杯省赛真题22】python剩余空间问题 青少年组蓝桥杯比赛python编程省赛真题解析

目录 python剩余空间问题 一、题目要求 1、编程实现 二、解题思路

【JavaEE】锁策略、CAS和synchronized的优化

目录 1、常见的锁策略 1.1、乐观锁 vs 悲观锁 1.2、轻量级锁 vs 重量级锁 1.3、自旋锁 vs 挂起等待锁 1.4、互斥锁 vs 读写锁 1.4.1、读写锁的使用场景&#xff08;适用于"频繁 读&#xff0c;不频繁写"的场景&#xff09; 1.5、可重入锁 vs 不可重入锁 1.…

计算机专业学习的核心是什么?

既然是学习CS&#xff0c;那么在这里&#xff0c;我粗浅的把计算机编程领域的知识分为三个部分&#xff1a; 基础知识 特定领域知识 框架和开发技能 基础知识是指不管从事任何方向的软件工程师都应该掌握的&#xff0c;比如数据结构、算法、操作系统。 特定领域知识就是你…

Python花瓣雨

目录 前言 小海龟 花朵类 移动函数 画花朵 尾声 前言 来啦来啦来啦&#xff0c;小伙伴们快快来领取七彩花瓣雨吧&#xff01;&#xff01; 小海龟 老生常谈啦&#xff0c;在用python画樱花树前&#xff0c;我们先来了解一下turtle吧&#xff01; 小海龟(Turtle)是P…

Java学习路线(13)——Collection集合类:List集合与Set集合

一、集合类体系结构 二、部分Collection类型对象 Collection集合特点 List系列集合是有序、可重复、有索引。 ArrayList&#xff1a;有序、可重复、有索引LinkedList&#xff1a;有序、可重复、有索引 Set系列集合是无序、不重复、无索引。 HashSet&#xff1a;无序、不重复…

0202条件过滤-自动装配原理-springboot2.7.x系列

1前言 在springboot的自动装配过程中&#xff0c;执行完候选配置类导入后&#xff0c;会进行条件过滤。那么在讲解条件过滤前&#xff0c;我们先来了解springboot常用的条件注解&#xff0c;以及它们底层执行原理。 在Spring Boot中&#xff0c;条件&#xff08;Condition&am…

使用qemu模拟CXL.mem设备

CXL可以说是自PCIe技术诞生几十年以来最具变革性的新技术了。可以想象有了CXL以后机箱的边界将被彻底打破&#xff0c;服务器互相使用对方的内存&#xff0c;网卡&#xff0c;GPU 。整个机架甚至跨机架的超级资源池化成为可能&#xff0c;云计算也将进入一个新的时代。 当前In…

C++寄存器优化

在C里面有个有趣的现象&#xff0c;先看代码 #include<iostream> using namespace std; int main() {int const tmp 100; //定义常量tmp tmp不能修改int const* p &tmp; //不能通过指针修改指向的值 int* const q const_cast<int*>(p); //去常属性 可以通过…

【C++11】C++11新增语法特性 右值引用/移动语义/完美转发

C11 右值引用 1 右值引用1.1 左值 、 右值1.2 左值引用 VS 右值引用1.3 谈谈C11引入右值引用的意义1.4 左值引用和右值引用的一些细节问题 2 移动语义3 完美转发4 总结 1 右值引用 1.1 左值 、 右值 在C中所有的值不是左值就是右值。左值是指表达式结束后依然存在的持久化对象…

【JavaSE】Java基础语法(二十二):包装类

文章目录 1. 基本类型包装类2. Integer类3. 自动拆箱和自动装箱4. int和String类型的相互转换 1. 基本类型包装类 基本类型包装类的作用 将基本数据类型封装成对象的好处在于可以在对象中定义更多的功能方法操作该数据常用的操作之一&#xff1a;用于基本数据类型与字符串之间的…

Goby 漏洞更新|锐捷网络 NBR路由器 webgl.data 信息泄露漏洞

漏洞名称&#xff1a;锐捷网络 NBR路由器 webgl.data 信息泄露漏洞 English Name&#xff1a;Ruijie NBR Router webgl.data information CVSS core: 7.5 影响资产数&#xff1a;204290 漏洞描述&#xff1a; 锐捷网络NBR700G路由器是锐捷网络股份有限公司的一款无线路由设…

口碑超好的挂耳式耳机盘点,这几款蓝牙耳机值得一看!

运动已成为人们业余生活中不可缺少的组成部分&#xff0c;徒步、夜跑、骑行等运动项目受到越来越多的人的喜欢&#xff0c;运动与耳机的搭配也是当代年轻人喜爱的行为方式&#xff0c;在颠簸的运动项目中耳机的稳固性和舒适性是非常主要的&#xff0c;现在新推出的开放式耳机深…

Ps:移除工具

移除工具 Remove Tool是一款简单易用、功能强大的工具&#xff0c;可快速、轻松地清去除图片中的干扰元素或不需要的区域。 快捷键&#xff1a;J 就如同使用画笔工具一样&#xff0c;只要在不需要的对象上涂抹&#xff08;描边&#xff09;即可将其去除。 移动工具基于人工智能…

几号发工资就能看出公司的好坏?(文末附招聘岗位)

作为一名资深的职场搬砖人&#xff0c;不知道各位最近有没有跟我一样关注到这个话题 ​#发工资时间看公司#小编刚看到这个话题的第一印象&#xff0c;想的是发工资时间无非是公司实力的体现&#xff0c;工资发的越早证明这个公司的现金流越稳定强大。 打开评论区&#xff0c;不…

Linux——进程优先级

1.什么是优先级&#xff1f; 优先级和权限息息相关。权限的含义为能还是不能做这件事。而优先级则表示&#xff1a;你有权限去做&#xff0c;只不过是先去做还是后去做这件事罢了。 2.为什么会存在优先级&#xff1f; 优先级表明了狼多肉少的理念&#xff0c;举个例子&#xff…

Processing通过编程实现艺术设计_实现艺术和现实的交互---数据设计分析002

还记得这个生命的游戏,也是在这上面有 https://processing.org/ 官网是这个 使用Processing可以用编程的方式来创作艺术 Processing是一门开源编程语言,可以直接对用它来做艺术创作, 可以看一些它的作品 https://processing.org/examples/gameoflife.html 官网是这个,完…

作为C/C++程序员你可以不使用但你必须会的Linux调试器-gdb(GNU Debugger)

gdb(GNU Debugger) 是一个用于调试 Linux 系统的软件工具。在学习 Linux 的过程中&#xff0c;gdb 的重要性不言而喻。以下是 gdb 在 Linux 学习者中的重要性的详细说明: 帮助理解 Linux 系统的运作方式:gdb 是一个强大的调试工具&#xff0c;可以帮助学习者深入了解 Linux 系统…

代码随想录算法训练营day53 | 1143.最长公共子序列,1035.不相交的线,53. 最大子序和 动态规划

代码随想录算法训练营day53 | 1143.最长公共子序列&#xff0c;1035.不相交的线&#xff0c;53. 最大子序和 动态规划 1143.最长公共子序列解法一&#xff1a;动态规划 1035.不相交的线解法一&#xff1a;动态规划 53. 最大子序和 动态规划解法一&#xff1a;动态规划解法二&am…

Python学习38:凯撒密码——解密

类型&#xff1a;字符串‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬ 描述‪‬‪…