一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第6天,点击查看活动详情。
题目描述
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
输入: l1 = [2,4,3], l2 = [5,6,4]
输出: [7,0,8]
解释: 342 + 465 = 807.
输入: l1 = [0], l2 = [0]
输出: [0]
输入: l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
输出: [8,9,9,9,0,0,0,1]
思路
两数相加这个题目,是一个比较中等难度的题目,也是大家一开始会碰到的前面几个题目,它的思路是,通过传入两个链表,首先创建一个链表,初始值为0,用来记录当前节点,并用于结果的返回,然后开始进行遍历链表,通过遍历,将这两个链表每个节点的数字都取出,进行相加,并处理进位。其中需要考虑到链表长度可能不一致,再较短的链表前面需要进行补0,保持两个链表对齐,再进行计算会好一点。
代码
public ListNode addTwo(ListNode node1, ListNode node2) {
//创建一个临时链表,用来返回结果,初始值为0
ListNode pre = new ListNode(0);
//获取当前列表,这时初始值是0
ListNode cur = pre;
//判断是否有进位
int carry = 0;
//判断是不是遍历完
while(node1 != null || node2 != null) {
//为空的时候补0
int x = node1 == null ? 0 : node1.val;
int y = node2 == null ? 0 : node2.val;
//处理结果相加
int sum = x + y + carry;
//判断是否进位
carry = sum / 10;
//拿到余数
sum = sum % 10;
//赋值
cur.next = new ListNode(sum);
//后移结果链表
cur = cur.next;
//后移链表
if(node1 != null)
node1 = node1.next;
//后移链表
if(node2 != null)
node2 = node2.next;
}
//处理进位
if(carry == 1) {
cur.next = new ListNode(carry);
}
//返回结果
return pre.next;
}
总结
两数相加,是一个中等难度的算法,一开始看到这种类型的题目,懵懵的,但实际上在读懂之后,进行处理,先想好思路,再逐步去验证,会发现其实很容易就理解了。其中主要的难点在于,怎么合适的处理好进位,还有补齐长度的时候会有点懵。总体来说,还是很好理解的一个题目