题目描述
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
该题目来源于leetcode,点击进入
链表如下:
public static class ListNode {
int val;
ListNode next;
ListNode(int x) {
val = x;
}
}
读题
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
解题
从示例中可以看出,可以将此问题看做一个数学题来计算。此处应该注意的有三点:
- 1、两个链表可能长度不一致
- 2、可能存在链表为空
- 3、可能出现额外的进位。比如 99 + 1 = 100
代码
public static ListNode addTwoNumbers(ListNode l1, ListNode l2) {
// 用于保存相加得到的结果 也用于最终返回 初始化为0
ListNode retunList = new ListNode(0);
ListNode p = l1, q = l2, curList = retunList;
// carry 表示相加超过10后的进位数值
int carry = 0;
// 只要有一个链表还有值,那么就要将计算进行下去
while (p != null || q != null) {
// 当链表存在空或者两个链表长度不一致时可能会出现空链表的情况,此时我们用0来与另一个链表相加
int x = p == null ? 0 : p.val;
int y = q == null ? 0 : q.val;
// 计算结果应为链表对应节点的值加上进位的值
int z = x + y + carry;
// 重新对进位的值进行赋值
carry = z / 10;
// 该节点的值为相加后个位的值 如9 + 5 = 14 那么该位上的值应当为4,1需要进位
curList.next = new ListNode(z % 10);
// 对下一个节点进行计算
curList = curList.next;
if (p != null) p = p.next;
if (q != null) q = q.next;
}
// 如果最终循环完成后还存在进位的值,应该向上进1位
if (carry > 0) {
curList.next = new ListNode(carry);
}
// 初始节点为0 所以返回的应该是它的next
return retunList.next;
}