2.两数相加

Source

传送门: 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]


题解

迭代

 

 

递归 

 

 

代码实现 

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;
    }
}