首页 > 其他分享 >445. 两数相加 II

445. 两数相加 II

时间:2022-10-20 23:01:11浏览次数:52  
标签:链表 ListNode 相加 445 next II l2 n1 n2

题目

给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。

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

示例1:

img

输入:l1 = [7,2,4,3], l2 = [5,6,4]
输出:[7,8,0,7]

难度:中等

题解

通过观察可以发现,做加法的顺序是相反的,为了逆序处理所有数位,可以使用栈:把所有的数字压入栈中,再依次取出相加。计算过程中需要注意进位的情况

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
           stack<int> s1,s2;   //两个栈用于反转链表
    while(l1) {
        s1.push(l1->val);
        l1=l1->next;
    }
    while(l2){
        s2.push(l2->val);
        l2=l2->next;
    }
    int n1=s1.size()-1,n2=s2.size()-1;
    int sum=0,top1,top2;
    ListNode *first,*p=NULL;
    while(n1>=0 || n2>=0 || sum>0){
        top1=top2=0;
        if(n1>=0){
            top1=s1.top();
            s1.pop();
            n1--;
        }
        if(n2>=0){
            top2=s2.top();
            s2.pop();
            n2--;
        }
        sum+=top1+top2;
        ListNode *t=new ListNode(sum%10);
        first=t;
        t->next=p;
        p=t;
        sum/=10;
    }
    return first;
    }
};


复杂度分析

  • 时间复杂度:O(max(n1,n2),其中n1,n2位两个链表的长度
  • 空间复杂度:O(n1+n2),空间复杂度主要取决于吧链表内容放进栈中所用的空间

标签:链表,ListNode,相加,445,next,II,l2,n1,n2
From: https://www.cnblogs.com/lazykora/p/16811667.html

相关文章