这是我参与2022首次更文挑战的第21天,活动详情查看:2022首次更文挑战
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
输入: l1 = [2,4,3], l2 = [5,6,4]
输出: [7,0,8]
解释: 342 + 465 = 807.
回到梦开始的地方,做了好多各种各样的题,突然回到这种逻辑题的时候还有些不适应
我们注意,他题中的描述,就是我们的数字他就只能有一位,而且他是倒序的形式,那说白了,不就是让我们一点一点的相加吗?我们就只需要使用一个变量去维护我们的进位,如果学过一点点汇编,那就很好理解了。
首先,第一个问题就是我们为什么要创建两个节点,我最开始创建的是一个,这也是我在做题的过程中所踩到的坑,一个节点是我们用来相加之后保存我们的数,但是这是链表,不是数组,我们再加到最后的时候,我们用于保存的节点也在链表的最后端,我们还需要一个头节点去维护我们的起始位置,用于返回
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode ret=null,head = null;
int cv = 0;
//只要两个链表有一个不为空,循环就继续
while (l1 != null||l2 != null){
//用两个变量去保存我们节点中的数值,如果节点为空,我们就用0去代替
int n1= l1 != null ? l1.val : 0 ;
int n2= l2 != null ? l2.val : 0 ;
int sum = n1 + n2 + cv ;
//我们第一次进入循环,我们一起创建两个节点
if(head==null){
head = ret = new ListNode(sum % 10);
}else {
//第二次之后的循环都在这里运算,因为我们第一次创建的是自身,我们第二次就要创建下一个
//如果我们不创建,那我们下一个指向的就是空
//如果不在if中,我们就会创建两次
ret.next = new ListNode(sum % 10);
ret = ret.next;
}
cv = sum/10;
if(l1!=null){
l1=l1.next;
}
if(l2!=null){
l2=l2.next;
}
}
//再循环结束之后,我们如果进位器不为零,就是我们最后一位进位,我们将他保存在最后
if(cv>0){
ret.next = new ListNode(cv % 10);
}
return head;
}
一道几乎没有多少算法知识的题,多数靠的就是我们逻辑思维能力,这可能就是,好多人做的第一道题,难度不大,就是我们在清理思路的过程中,我们不要忘记我们的进位器,因为使用的是链表,所以我们还需要注意,每一个节点都需要new,不然就会出现null