1. 程式人生 > 其它 >leetcode_資料結構_連結串列_445兩數相加二(STL庫stack棧的使用)

leetcode_資料結構_連結串列_445兩數相加二(STL庫stack棧的使用)

題目連結:

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