给定两个用链表表示的整数,每个节点包含一个数位。这些数位是反向存放的,也就是个位排在链表首部。编写函数对这两个整数求和,并用链表形式返回结果。这些数位是反向存放的,也就是个位排在链表首部。编写函数对这两个整数求和,并用链表形式返回结果。
示例:
输入:(7 -> 1 -> 6) + (5 -> 9 -> 2),即617 + 295
输出:2 -> 1 -> 9,即912
进阶:假设这些数位是正向存放的,请再做一遍。
示例:
输入:(6 -> 1 -> 7) + (2 -> 9 -> 5),即617 + 295
输出:9 -> 1 -> 2,即912
思路:
用递归解法,分别从两个链表的第一个节点开始,取一个值相加,相加的结果对10取模,取模得到值作为结果的一位节点。重复上述操作再从两个链表的下一位取值相加
(
注
意
得
加
上
前
一
次
操
作
的
进
位
)
\color{red}{(注意得加上前一次操作的进位)}
(注意得加上前一次操作的进位),结果存入结点,通过递归将这些节点连接起来。
代码如下:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
//add为求和函数
ListNode res = add(l1, l2, 0);
return res;
}
//head1和head2分别为两个链表的第一个元素,value为上一次操作的进位
static ListNode add(ListNode head1,ListNode head2, int value) {
if (head1 == null && head2 == null) {
if (value == 1) {
//最后还有进位需要生成最后一个值为1的节点
return new ListNode(1);
} else {
//已完成最后一位的相加操作,开始逐层返回
return null;
}
}
if (head1 != null) {
//链表1要相加的那位不为空就把值加上
value += head1.val;
}
if (head2 != null) {
//链表2要相加的那位不为空就把值加上
value += head2.val;
}
//如果两个值相加后>=10就会产生进位,对10取模可得到减去进位的值
ListNode res = new ListNode(value % 10);
//如果两位相加的值小于10则没有进位,即进位为0
//如果两位相加的值>=10,则要向高位进1
//此处value值的意义变成了向高位的进位
value = value < 10 ? 0 : 1;
//此处的三目运算符功能是防止产生空指向异常,只有head1或者head2
//不为空的情况才下才有next节点
//传入的value值为向高位的进位
res.next = add(head1==null?null:head1.next, head2==null?null:head2.next, value);
return res;
}
}