题目描述:
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例 1:
输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.
示例 2:
输入:l1 = [0], l2 = [0]
输出:[0]
示例 3:
输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
输出:[8,9,9,9,0,0,0,1]
提示:
- 每个链表中的节点数在范围
[1, 100]
内 0 <= Node.val <= 9
- 题目数据保证列表表示的数字不含前导零
思路:
- 题目给出信息是两个链表都是非空,节点的值是处于0-9之间,需要返回的结果是一个两数相加的逆序链表;
- 由题目信息得出,两个链表每个节点相加得到的进位要么是0或者1
- 我们可以额外定义一个新链表,链表每个节点存储题目给出两个链表对应节点相加后的结果,额外定义一个变量up存储上一次相加得到的进位(0或者1),up进位会加入到两个链表节点值相加的运算。
- 使用递归不断对两个链表进行相加运算,直到两个链表遍历的节点都为null,这个时候需要判断up是否为0,为0返回null,不为0需要往新链表尾部加入值为up的节点
- 两个链表不一定是等长的,所以会遇到一条链表遍历结束但是另外一条链表还为遍历结束的情况,这个时候仍需继续递归遍历,只不过要将传入递归方法的参数列表其中对应遍历结束链表的参数置为null
代码:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
int up = 0;
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
if(l1==null&&l2==null){
if(up!=1) return null;
else return new ListNode(up);
}
if(l1==null){
ListNode node = new ListNode((l2.val + up)%10);
up = (l2.val + up)/ 10;
node.next = addTwoNumbers(null,l2.next);
return node;
}
if(l2==null){
ListNode node = new ListNode((l1.val + up)%10);
up = (l1.val+up) / 10;
node.next = addTwoNumbers(l1.next,null);
return node;
}
ListNode node = new ListNode((l1.val + l2.val + up)%10);
up = (l1.val + l2.val + up)/10;
node.next = addTwoNumbers(l1.next,l2.next);
return node;
}
}