给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头
- 举例:
输入: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]输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807
- 提示
每个链表中的节点数在范围 [1, 100] 内
0 <= Node.val <= 9
题目数据保证列表表示的数字不含前导零
- 结果展示
public class LinkAddMain {
//[2,4,3]
//[5,6,4]
public static void main(String[] args) {
ListNode l1 = new ListNode(5);
// l1.next = new ListNode(9);
// l1.next.next = new ListNode(9);
// l1.next.next.next = new ListNode(9);
// l1.next.next.next.next = new ListNode(9);
// l1.next.next.next.next.next = new ListNode(9);
ListNode l2 = new ListNode(4);
// l2.next = new ListNode(9);
// l2.next.next = new ListNode(9);
ListNode listNode = addTwoNumbers(l1, l2);
System.out.println(listNode);
}
public static ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode pre = new ListNode(-1);
ListNode addNodeList = pre;
//记录是否有进位
int flag = 0;
//链表上每个元素相加后的值,每次循环要清空
int temp = 0;
//遍历两条链表
while (l1 != null || l2 != null) {
//如果链表为空则不需要进行计算
if (l1 != null) {
temp += l1.val;
l1 = l1.next;
}
if (l2 != null) {
temp += l2.val;
l2 = l2.next;
}
//当相加等于9并且在flag等于1时不处理则会出现链表上的val为10的情况
if(temp == 9 && flag == 1){
temp += flag;
flag = 0;
}
if (temp > 9) {
addNodeList.next = new ListNode(temp - 10 + flag);
//大于9将flag改为1相当于进位
flag = 1;
} else {
addNodeList.next = new ListNode(temp + flag);
flag = 0;
}
addNodeList = addNodeList.next;
temp = 0;
}
//循环后如果flag==1时,需要进位
if(flag == 1){
addNodeList.next = new ListNode(1);
}
return pre.next;
}
}
class ListNode {
int val;
ListNode next;
ListNode(int val) {
this.val = val;
}
ListNode(int val, ListNode next) {
this.val = val;
this.next = next;
}