题目
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
试例
输入:l1 = [2,4,3], l2 = [5,6,4] 输出:[7,0,8] 解释:342 + 465 = 807.
解题思路
刚开始拿到题目的时候想的是把链表的数据都取出来,通过字符串拼接的方式将他们连起来。然后再反转之后通过Integer.parseInt()方法将所拼接的字符串转换成整数,之后就被
教做人了,Integer.parseInt()转换的范围是有限制的。后面仔细阅读题目发现这两个链表的存储方式为逆序刚好和正常整数的加法相类似,低位在前,进位加一,于是我通过遍历两个链表来进行相加,利用一个count值来计算是否进位,具体实现如下。
具体实现
int count = 0;//进位数
List<Integer> list = new ArrayList<>();//用于存储最后数据
for(;;){
if (l1 != null && l2 != null){//如果两个链表都不为空时
int number = l1.val+l2.val+count;//将两个链表的数据相加
if(number < 10){
list.add(number);
count = 0;
}else{//如果大于10
list.add(number-10);
count = 1;//进位
}
try{
l1 = l1.next;//捕获异常
}catch (Exception e){
l1 = null;//处理异常
continue;
}
try{
l2 = l2.next;
}catch (Exception e){
l2 = null;
continue;
}
}
if(l1 != null && l2 == null){
int number = l1.val+0+count;
if(number>= 10){
list.add(number-10);
count = 1;
}else{
list.add(number);
count = 0;
}
try{
l1 = l1.next;
}catch (Exception e){
l1 = null;
continue;
}
}
if (l1 == null && l2 != null) {
int number = l2.val+0+count;
if(number >= 10){
list.add(number-10);
count = 1;
}else {
list.add(number);
count = 0;
}
try{
l2 = l2.next;
}catch (Exception e){
l2 = null;
continue;
}
}
if(l1 == null && l2 == null){
// break;
if(count == 0){
break;
}else{
list.add(count);
break;
}
}
}
ListNode l = new ListNode(list.get(0));
for (int i = list.size()-1; i > 0; i--) {//将最后数据存储在链表中返回
ListNode l222 = new ListNode(list.get(i),l.next);
l.next = l222;
}
return l;
在写代码的时候,自己测试时由于给的两个链表长度是一样的,所以没有出现问题,拿去测试时,发现有空指针异常错误。仔细阅读代码发现,当链表中走到最后一个节点时依旧用l = l.next即抛出空指针异常。于是我利用try-catch的方式来捕获异常,如果在try里面发现异常则在catch里面直接对链表进行为空。具体书写如下