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

 

posted @ 2022-02-28 12:29  sylvia11  阅读(32)  评论(0编辑  收藏  举报