Leetcode: 2.Add Two Numbers 两数相加

Add Two Numbers 两数相加

给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。

如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

您可以假设除了数字 0 之外,这两个数都不会以 0 开头。

输入:

2 -> 4 -> 3 
5 -> 6 -> 4

输出:

7 -> 0 -> 8

因为 342 + 465 = 807


使用变量carry来跟踪进位,模拟逐位相加的过程
注意当链表长度不一时的处理

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        ListNode *dummy = new ListNode(-1), *cur = dummy;
        int carry=0;
        while(l1||l2){
            int val1 = l1!=NULL ? l1->val : 0;
            int val2 = l2!=NULL ? l2->val : 0;
            cur->next=new ListNode((val1+val2+carry) % 10);;
            carry=(val1+val2+carry)/10;
            if(l1)l1=l1->next;
            if(l2)l2=l2->next;
            cur=cur->next;
        }
        if (carry) cur->next = new ListNode(1);
       return dummy->next;     
    }
    
};

时间复杂度:O(max(m,n))
假设 m 和 n分别表示 l1 和 l2的长度,上面的算法最多重复max(m,n) 次。
空间复杂度:O(max(m,n)),
新列表的长度最多为max(m,n)+1。


扩展:如果如果链表中的数字不是按逆序存储的呢?例如:
输入:

3 -> 4 -> 2 
4 -> 6 -> 5

输出:

8-> 0 -> 7

因为 342 + 465 = 807


方法:用栈来存储(先进后出)再按位相加
而且,永远在结果前面增添头节点


相关标签:
链表 数学
相似题目:
字符串相乘
二进制求和
两整数之和
字符串相加
两数相加 II
数组形式的整数加法

你可能感兴趣的:(Leetcode刷题记录)