给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 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]
提示:
- 每个链表中的节点数在范围
[1, 100]
内 0 <= Node.val <= 9
- 题目数据保证列表表示的数字不含前导零
草图:(对照上面图片例子)
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
/**
* 给你两个非空的链表,表示两个非负的整数。它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储一位数字。
* 请你将两个数相加,并以相同形式返回一个表示和的链表。
* 你可以假设除了数字0之外,这两个数都不会以0开头。
*/
/**
* 典型的竖式加法模拟题:首先个位相加,其次十位,百位,千位...每次加的时候逢十进一
*/
public class AddTest {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
//首先,对链表题目有一个虚拟的头结点
ListNode dummyHead = new ListNode(-1);
//令当前的指针等于虚拟头结点
ListNode cur = dummyHead;
//设置一个进位temp
int temp = 0;//进位一开始等于0
//依次重复这个过程,条件:第一个链表里边有数,或者第二个链表里面有数,或者当前进位不等于0!
while (l1 != null || l2 != null || temp != 0) {//tmep!=0 是如果最后一次刚好进位上去就把进位位写到逆序的最后一位
//首先拿到第一个链表种要加的数
int val1 = l1 == null ? 0 : l1.val;//如果链表一为空直接返回0,否则就返回链表一中的值
int val2 = l2 == null ? 0 : l2.val;//同理(三元运算符)
//两个数相加每一次都要考虑之前的进位(如果存在也就是进位不为0)
temp += val1;//将链表一的值加到进位位里
temp += val2;//再将链表二的值加到进位位,实现了对应位数上相加再加上进位
//声明当前要存放的数字的结点:存放的值应该是temp对10取模的结果
ListNode node = new ListNode(temp % 10);
//然后当前指针就指向下一个结点 c的位置-1 -》 0 ,值变成了8
cur.next = node;
//每一次将当前结点指向下一个结点的时候,当前结点也要向后(逆序)移动一个位置
cur=cur.next;
//temp就应该向前进位了 temp除以10 temp/10 -> 表示进位是0(小于10)或者1(大于10)
temp = temp / 10;//temp / =10
//此时考虑链表1不为空链表1就往前进位 l2同理
if(l1!=null){
l1=l1.next;
}
if(l2!=null){
l2=l2.next;
}
}
//最后将虚拟的头节点的next返回即可
return dummyHead.next;
}
}