ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

leetcode_数据结构_链表_445两数相加二(STL库stack栈的使用)

2021-06-18 20:06:08  阅读:116  来源: 互联网

标签:dummy ListNode val STL top next 链表 tag 两数


题目链接:

https://leetcode-cn.com/problems/add-two-numbers-ii/

意思就是两个数字相加,但是这两个数字分别存在两个链表中,每个链表中的一个结点代表该数字的一位。

解法:利用栈,先将两个链表中的数字反向存入两个栈中,这样栈顶即为每个数字的末位(最低位),然后就可以从两个栈的栈顶开始,分别相加,相加超过10就进位1,算到下一位相加中。

创立哑结点作为新结点的头节点,每一次栈顶两位相加后就创建一个新节点,然后用头插法插入链表中。

然后再讨论一个栈空后的情况,其实就是将另一个栈栈顶一直看为0.

这里要列以下STL stack的使用方法:

使用前添加头文件:

#include <stack>

定义:

stack<int> a;

其中,<>中也可为其他类型。

方法:

a.push();
s.pop();
a.size();
a.top();
a.empty();

最后,附上该题代码:

/**
 * 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) {}
 * };
 */
 #include <stack>
 #include <vector>
class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        stack<int> a,b;
        ListNode *p1=l1,*p2=l2;
        ListNode *dummy=new ListNode(0);
        dummy->next=nullptr;
        int tag=0;//进位标志
        while(p1){
            a.push(p1->val);
            p1=p1->next;
        }
        while(p2){
            b.push(p2->val);
            p2=p2->next;
        }
        while(!a.empty()||!b.empty()){
            ListNode *q=new ListNode(0);
            q->val=0;

            if(!a.empty()&&!b.empty()){
                if(tag==1)q->val=1;
                tag=0;
                if((a.top()+b.top()+q->val)>=10){
                    tag=1;
                }
                q->val=(a.top()+b.top()+q->val)%10;
                a.pop();
                b.pop();
            }
            else if(!a.empty()){
                if(tag==1)q->val=1;
                tag=0;
                if(q->val+a.top()>=10){
                    tag=1;
                }
                q->val=(a.top()+q->val)%10;
                a.pop();
            }
            else{
                if(tag==1)q->val=1;
                tag=0;
                if(q->val+b.top()>=10){
                    tag=1;
                }
                q->val=(b.top()+q->val)%10;
                b.pop();
            }

            q->next=dummy->next;
            dummy->next=q;
        }
        if(tag==1){//防止5+5的情况只输出0
            ListNode *q=new ListNode(0);
            q->val=1;
            q->next=dummy->next;
            dummy->next=q;
        }
        ListNode *ans=dummy->next;
        delete dummy;
        return ans;
    }
};

 

标签:dummy,ListNode,val,STL,top,next,链表,tag,两数
来源: https://www.cnblogs.com/San-Francisco/p/14901021.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有