剑指 Offer II 025. 链表中的两数相加
给定两个 非空链表 l1和 l2 来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。
可以假设除了数字 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
进阶:如果输入链表不能修改该如何处理?换句话说,不能对列表中的节点进行翻转。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/lMSNwu
题解:难点在链表的处理上,首先先用两个栈把两个链表反转过来,然后就是很基础的逐个相加再进位。
1 /** 2 * Definition for singly-linked list. 3 * struct ListNode { 4 * int val; 5 * ListNode *next; 6 * ListNode() : val(0), next(nullptr) {} 7 * ListNode(int x) : val(x), next(nullptr) {} 8 * ListNode(int x, ListNode *next) : val(x), next(next) {} 9 * }; 10 */ 11 class Solution { 12 public: 13 ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) { 14 stack<int> s1,s2; 15 ListNode* a=new ListNode;//新建一个链表头节点。因为链表定义了构造方法,会多一个 头指针有值为0; 16 int b=0;//进位数 17 int now=0;//当前数 18 while(l1!=nullptr) //当前节点值不为空,加入栈中。 19 { 20 s1.push(l1->val); 21 l1=l1->next; 22 } 23 while(l2!=nullptr) 24 { 25 s2.push(l2->val); 26 l2=l2->next; 27 } 28 29 while(!s1.empty()||!s2.empty())//当栈都不为空时候 30 { 31 now=0; 32 if(!s1.empty()&&!s2.empty()) 33 { 34 now+=s1.top()+s2.top(); 35 s1.pop();s2.pop(); 36 37 } 38 else if(!s2.empty()) 39 { 40 now+=s2.top();s2.pop(); 41 } 42 else if(!s1.empty()) 43 { 44 now+=s1.top();s1.pop(); 45 } 46 47 ListNode* neww=new ListNode; //创建一个新节点 48 neww->val=((b+now)%10); 49 neww->next=a->next; //用链表的头插法,新节点先指向头节点的指向的 50 a->next=neww;//头指针的指向 改为新节点 51 b=(b+now)/10;//更新进位位 52 } 53 54 if(b){//存最后的进位 55 ListNode* neww=new ListNode; 56 neww->val=(b); 57 neww->next=a->next; 58 a->next=neww; 59 } 60 return a->next;//由于头指针有值,然后时候我们要去掉头指针,直接指向第一个数 61 } 62 };