2. 两数相加
原题链接
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
要点
两个链表对应相同位置相加,如果超过10那么需要将个位数保留,十位数往下记录。
特别指出在链表
解法
创建一个Result
结果链表,过程如下:
- 3+3 = 6
- 5+5 = 10,个位保留0,十位
1
向下传递 - 5+5+
1
= 11,个位保留1,十位1
向下传递 - 0+0+
1
= 1
代码片段
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
if (l1 == null) {//1. 如果l1 或者 l2为空,返回另一个就行了。
return l2;
} else if (l2 == null) {
return l1;
}
ListNode listNode = new ListNode(0);//2.创建一个用来保存结果的链表,第一个节点没有实际用途。
ListNode cur = listNode;//4.创建一个指针来更新当前写入的位置,不能直接用listNode,否则结果就只剩最后一个节点。
var nextV = 0;//5.两数相加,有可能大于等于10,此时要记录十位的信息到下一个位置。
while (l1 != null || l2 != null) {//6.只要其中一个链表还有数字就可以继续做加法。
int l1V = 0;
int l2V = 0;
if (l1 != null) {//7. 如果当前结点不为空,更新其中一个加数,并指向下一个位置。
l1V = l1.val;
l1 = l1.next;
}
if (l2 != null) {
l2V = l2.val;
l2 = l2.next;
}
int val = l1V + l2V + nextV;//8.将所有的值相加。
int v = val % 10;//9.保留个位数
nextV = val / 10;//10.更新十位数
cur.next = new ListNode(v);//11.创建一个相加之后的节点信息
cur = cur.next;//12.指向下一个创建节点的位置。
}
if (nextV > 0) {//13.特殊情况,如果两个链表都遍历完毕了,如果十位还是数字应该创建一个节点。
cur.next = new ListNode(nextV);
}
return listNode.next;//3.返回结果链表的下一个节点,放弃初始化的第一个节点。
}
结尾
1.博客地址
2.源代码仓库
如果你在代码里看到了用 数字标记的注释 如 //1.xxx 这是我写代码的顺序,希望能给你一点启发。