445. 两数相加 II
给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。
你可以假设除了数字 0 之外,这两个数字都不会以零开头。
示例1:
输入:l1 = [7,2,4,3], l2 = [5,6,4] 输出:[7,8,0,7]
示例2:
输入:l1 = [2,4,3], l2 = [5,6,4] 输出:[8,0,7]
示例3:
输入:l1 = [0], l2 = [0] 输出:[0]
提示:
- 链表的长度范围为
[1, 100]
0 <= node.val <= 9
- 输入数据保证链表代表的数字无前导 0
-
/** * 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 carry=0; ListNode* head=new ListNode(0); ListNode* pre=head; while(!s1.empty()||!s2.empty()){ if(!s1.empty()){ carry=carry+s1.top(); s1.pop(); } if(!s2.empty()){ carry=carry+s2.top(); s2.pop(); } int sum=carry%10; carry=carry/10; ListNode *node=new ListNode(sum); //头插法 node->next=pre->next; pre->next=node; } if(carry!=0){ ListNode *node=new ListNode(carry); node->next=pre->next; pre->next=node; } return pre->next; } };