正在建设中
传送门: https://leetcode.cn/problems/add-two-numbers/
题目描述
给你两个非空的链表,表示两个非负的整数。它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储一位数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字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.以输入:l1 = [2,4,3],l2 = [5,6,4]为例,创建一个用于返回结果的连表res和,用于记录进位且初始值为0的变量carry,;
2.利用循环实现l1和l2间的逐位(节点)求和,该循环继续的条件为l1和l2不同时为空;
3.每次循环开始时,创建两个变量(x,y)分别存储连表l1,l2中节点的值并判断节点是否为空,若为空则赋值为0,否则等于节点中所存储的值,之后将两个变量及进位carry作为加数,计算三者间的和(x+y+carry);
4.完成后,
递归
代码实现
C++
迭代:
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode* res=new ListNode();
ListNode* curr=res;
int carry=0;
while(l1||l2){
int x=l1?l1->val:0;
int y=l2?l2->val:0;
int sum=x+y+carry;
curr->next=new ListNode(sum%10);
curr=curr->next;
carry=sum/10;
if(l1) l1=l1->next;
if(l2) l2=l2->next;
}
if(carry!=0) curr->next=new ListNode(carry);
return res->next;
}
};
递归:
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
if(!l1) return l2;
if(!l2) return l1;
int sum = l1->val + l2->val;
ListNode* res = new ListNode(sum % 10);
res->next = addTwoNumbers(l1->next, l2->next);
if(sum > 9) res->next =addTwoNumbers(res->next, new ListNode(1));
return res;
}
};
C#
迭代:
public class Solution {
public ListNode AddTwoNumbers(ListNode l1, ListNode l2) {
ListNode res=new ListNode();
ListNode curr=res;
int carry=0;
while(l1!=null||l2!=null){
int x=l1!=null?l1.val:0;
int y=l2!=null?l2.val:0;
int sum=x+y+carry;
curr.next=new ListNode(sum%10);
curr=curr.next;
carry=sum/10;
if(l1!=null) l1=l1.next;
if(l2!=null) l2=l2.next;
}
if(carry!=0) curr.next=new ListNode(carry);
return res.next;
}
}
递归:
public class Solution {
public ListNode AddTwoNumbers(ListNode l1, ListNode l2) {
if(l1 == null) return l2;
if(l2 == null) return l1;
int sum = l1.val + l2.val;
ListNode res = new ListNode(sum % 10);
res.next = AddTwoNumbers(l1.next, l2.next);
if(sum > 9) res.next = AddTwoNumbers(res.next, new ListNode(1));
return res;
}
}