/**
* 给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
* 请你将两个数相加,并以相同形式返回一个表示和的链表。
* 你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
* 输入: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
* 题目数据保证列表表示的数字不含前导零
*/
public class 两数相加 {
public static Node.IntNode addTwoNumbers(Node.IntNode list1, Node.IntNode list2) {
Node.IntNode resNode = new Node.IntNode(-1);
Node.IntNode tempNode1 = list1;
Node.IntNode tempNode2 = list2;
boolean needAdd = false;
while (tempNode1 != null || tempNode2 != null || needAdd) {
//为节点付默认值
int v1 = tempNode1 == null ? 0 : tempNode1.val;
int v2 = tempNode2 == null ? 0 : tempNode2.val;
//计算合并后节点值
int v3 = v1 + v2;
if (needAdd) {
v3 = v1 + v2 + 1;
}
//判断下一个节点是否加1
if (v3 >= 10) {
v3 = v3 % 10;
needAdd = true;
} else {
needAdd = false;
}
//将新节点追加到resNode最后面
Node.IntNode resTempNode = resNode;
while (resTempNode.next != null) {
resTempNode = resTempNode.next;
}
resTempNode.next = new Node.IntNode(v3);
//指针到下一个节点
if (tempNode1 != null) {
tempNode1 = tempNode1.next;
}
if (tempNode2 != null) {
tempNode2 = tempNode2.next;
}
}
return resNode.next;
}
public static void main(String[] args) {
Node.IntNode resNodes = addTwoNumbers(Node.getSameNode(4, 3), Node.getSameNode(1, 6));
Node.IntNode tempNode = resNodes;
while (tempNode != null) {
System.out.println("遍历 n = " + tempNode.val);
tempNode = tempNode.next;
}
}
}