题目描述
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 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]
总体思路
本题是进行链表中的两个数相加,而且比较人性化的一点就是本题中的数字在链表中是逆序存放的,这比较符合我们平时做加法运算的习惯,如果数字在链表中是正序存放可能会更麻烦一点。由于数字在链表中是逆序存放,那么可以直接遍历链表,让对应的两个数相加即可,但是要注意保留进位,而且要注意加到最后一位时如果最后两个数的和是两位数的话也要在和链表中多加一位。当然,以上说的是两个数字位数相同的情况,如果位数不相同在两个数可以直接相加的前半段仍然按照上述方法计算,但是当另一个链表的长度不足时需要进行单独处理,其实处理方法和前半段类似,但是需要去除一个长度不足的链表进行计算。以上纯属分析,在进行代码实现时为了保证代码的简洁性,可能会和以上思路有所不同,但是基本的思想都是一样的。
代码实现
public static ListNode addTwoNumbers(ListNode l1, ListNode l2) {
//新建一个链表用于保存计算结果
ListNode l = new ListNode(),lNode = l;
//用于保存进位值
int nextValue = 0;
//当两个链表都为空时说明两个链表都已经遍历完成
while(l1 != null || l2 != null){
//保存当前位的两个数的和
int tempSum = nextValue;
//l1没有遍历完才能参加计算
if (l1 != null){
tempSum += l1.val;
}
//l2没有遍历完才能参加计算
if (l2 != null){
tempSum += l2.val;
}
//得到当前位的值
int thisValue = tempSum % 10 ;
//得到进位值
nextValue = tempSum / 10;
//新增当前位计算结果节点
l.next = new ListNode(thisValue,null);
l = l.next;
//遍历下一节点
if (l1 != null){
l1 = l1.next;
}
if (l2 != null){
l2 = l2.next;
}
//当前是最后一位,需要考虑进位
if(l1==null && l2==null && nextValue!=0){
l.next = new ListNode(nextValue,null);
}
}
return lNode.next;
}
运行 结果
1.示例1运行结果
2.示例2运行结果
3.示例3运行结果
结果分析
由以上示例的运行结果可知,该种解法能够得到正确结果,提交到leetcode平台也能够通过测试。
这应该是在预料之中的,因为像这种比较复杂的题目一般不会对时间有太高的要求。
总结
本题难度不是很大,只要对链表足够熟悉,应该能够快速解决,但是我却把链表给忘得差不多了,所以还是花了一些时间的。