前言:📫 作者简介:小明java问道之路,专注于研究计算机底层,就职于金融公司后端高级工程师,擅长交易领域的高安全/可用/并发/性能的设计和架构📫
🏆 Java领域优质创作者、阿里云专家博主、华为云享专家🏆
🔥 如果此文还不错的话,还请👍关注、点赞、收藏三连支持👍一下博主哦
本文导读
字节跳动企业题库,链表系列,因为有leetcode会员能看到企业出题频率,那我们从出题频率最高刷到最低,题目有2. 两数相加
2. 两数相加
【中等】【题目描述】给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例 1:输入:l1 = [2,4,3], l2 = [5,6,4] 输出:[7,0,8] 解释:342 + 465 = 807.
示例 2:输入:l1 = [0], l2 = [0] 输出:[0]
示例 3:输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9] 输出:[8,9,9,9,0,0,0,1]
这是所有大厂最爱考的链表题目,对于熟悉链表的同学来说是秒杀的,我们用模拟法解题
【模拟法】图解:
代码详解,逐行注释:
publicListNodeaddTwoNumbers(ListNodel1, ListNodel2) { /*模拟法*/ListNodehead=null, tail=null; // 初始化返回列表的哑结点intcarry=0; // 将进位carry初始化为0while (l1!=null||l2!=null) { // 遍历列表l1和l2直至尾端intn1=l1!=null?l1.val : 0; intn2=l2!=null?l2.val : 0; intsum=n1+n2+carry; // 设定sum// 创建一个数值为sum%10的新节点,并设置为当前节点的下一个节点,然后将当前节点进入到下一节点if (head==null) { head=tail=newListNode(sum%10); } else { tail.next=newListNode(sum%10); tail=tail.next; } carry=sum/10; // 更新进位值,carry设置为sum的10位if (l1!=null) l1=l1.next; // 向前移动if (l2!=null) l2=l2.next; } if (carry>0) // 检查carry是否大于0,如果成立,则返回列表追加carrytail.next=newListNode(carry); returnhead; } }