给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-two-numbers
一道链表的题,具体解法如下
比较难理解的是链表指向下一个链表时的操作,即
curr.next = new ListNode(sum%10);
curr = curr.next;
这是由链表的存储结构决定的,因为是单向链表,因此在创建完下一个链表时就需要将对象(类似指针)移到下一个链表,然后继续初始化下下一个链表。如此一直往下直到创建完成,然后可由最开始的哑节点来找到链表的头节点。
public static ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode dummyNode = new ListNode(0);
ListNode curr = dummyNode;
ListNode p1 = l1;
ListNode p2 = l2;
// 每次相加的进位
int carry = 0;
// 两个链表,其中一个可能比另一个长,所有可能存在其中一个为null的情况
while (p1 != null || p2 != null) {
int val1 = p1 == null ? 0: p1.val;
int val2 = p2 == null ? 0: p2.val;
int sum = val1 + val2 + carry;
// 加完carry以后再取新的
carry = sum/10;
curr.next = new ListNode(sum%10);
curr = curr.next;
p1 = p1 == null ? null: p1.next;
p2 = p2 == null? null: p2.next;
}
// 求和后可能有额外的进位,类似 9->9, 1
if (carry != 0) {
curr.next = new ListNode(carry);
}
return dummyNode.next;
}