//给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 // 数字。 // // 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。 // // 您可以假设除了数字 0 之外,这两个数都不会以 0 开头。 // // 示例: // // 输入:(2 -> 4 -> 3) + (5 -> 6 -> 4) //输出:7 -> 0 -> 8 //原因:342 + 465 = 807 // // Related Topics 链表 数学
package com.hunter.leetcode;
/**
* @author hunter.yang
* @version 1.0
* @description null
* @date 2020/10/25 16:28
*/
public class Solution2 {
public static class ListNode {
int val;
ListNode next;
ListNode() {}
ListNode(int val) { this.val = val; }
ListNode(int val, ListNode next) { this.val = val; this.next = next; }
}
public static ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode result = new ListNode();
ListNode preNode = new ListNode();
boolean ifNeedAddOne = false;
boolean firstCal = true;
while (null != l1 || null != l2) {
ListNode node = new ListNode();
int l1Value = 0;
int l2Value = 0;
if (null != l1) {
l1Value = l1.val;
}
if (null != l2) {
l2Value = l2.val;
}
if (ifNeedAddOne) {
if (null == l1) {
l2Value = l2Value + 1;
node.val = gtTenLeftValue(0, l2Value);
} else if (null == l2){
l1Value = l1Value + 1;
node.val = gtTenLeftValue(l1Value, 0);
} else {
l1Value = l1Value + 1;
node.val = gtTenLeftValue(l1Value, l2Value);
}
} else {
if (null == l1) {
node.val = gtTenLeftValue(0, l2Value);
} else if (null == l2){
node.val = gtTenLeftValue(l1Value, 0);
} else {
node.val = gtTenLeftValue(l1Value, l2Value);
}
}
ifNeedAddOne = judge(l1Value, l2Value);
if(firstCal) {
result = node;
firstCal = false;
preNode = result;
} else {
preNode.next = node;
preNode = node;
}
if (null != l1) {
l1 = l1.next;
}
if (null != l2) {
l2 = l2.next;
}
if (null == l1 && null == l2 && ifNeedAddOne) {
ListNode lastNode = new ListNode();
lastNode.val = 1;
preNode.next = lastNode;
}
}
return result;
}
// 判断两个数相加是否需要向前一位加1
private static boolean judge(int nodeValue1, int nodeValue2) {
if (nodeValue1 + nodeValue2 >= 10) {
return true;
} else {
return false;
}
}
private static int gtTenLeftValue(int nodeValue1, int nodeValue2) {
int sum = nodeValue1 + nodeValue2;
if (sum >= 10) {
return sum%10;
} else {
return sum;
}
}
public static void main(String[] args) {
ListNode l1 = new ListNode(9,
new ListNode(9,
new ListNode(9,
new ListNode(9,
new ListNode(9,
new ListNode(9,
new ListNode(9)))))));
ListNode l2 = new ListNode(9, new ListNode(9, new ListNode(9, new ListNode(9))));
System.out.println(addTwoNumbers(l1, l2));
}
}