【LeetCode】445. 兩數相加 II
阿新 • • 發佈:2018-12-16
題目描述
給定兩個非空連結串列來代表兩個非負整數。數字最高位位於連結串列開始位置。它們的每個節點只儲存單個數字。將這兩數相加會返回一個新的連結串列。
你可以假設除了數字 0 之外,這兩個數字都不會以零開頭。
進階: 如果輸入連結串列不能修改該如何處理?換句話說,你不能對列表中的節點進行翻轉。
示例
輸入: (7 -> 2 -> 4 -> 3) + (5 -> 6 -> 4) 輸出: 7 -> 8 -> 0 -> 7
解決方法
分三步:(1)將連結串列中的數字轉化成字串形式 (2)兩個字串相加 (3)將相加的結果放入連結串列中
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
//分三步:(1)將連結串列中的數字轉化成字串形式 (2)兩個字串相加 (3)將相加的結果放入連結串列中
string num1,num2;//(1)將連結串列中的數字轉化成字串形式
while(l1){
num1+=(l1->val+'0');
l1=l1->next;
}
while (l2){
num2+=(l2->val+'0');
l2=l2->next;
}
string result=addStrings(num1,num2);//(2)兩個字串相加
ListNode *head=new ListNode(0);//(3)將相加的結果放入連結串列中
ListNode *tail=head;
for (int i=0;i<result.size();i++){
tail=tail-> next=new ListNode(0);
tail->val=(result[i]-'0');
}
return head->next;
}
private:
string addStrings(string num1, string num2) {
// 415. 字串相加
string a=num1,b=num2;
int len=max(a.size(),b.size());//補零
if (a.size()<len){
int temp=len-a.size();
while(temp--){
a+='0';
for (int i=a.size()-1;i>=1;i--)
a[i]=a[i-1];
a[0]='0';
}
}
if (b.size()<len){
int temp=len-b.size();
while(temp--){
b+='0';
for (int i=b.size()-1;i>=1;i--)
b[i]=b[i-1];
b[0]='0';
}
}
int add=0;//進位
string result(len,'0');
for (int i=len-1;i>=0;i--){
int temp=(a[i]-'0')+(b[i]-'0');
result[i]=add+temp%10+'0';
add=(result[i]-'0')/10+temp/10;
result[i]=(result[i]-'0')%10+'0';
}
if (add==1){
result+='0';
for (int i=result.size()-1;i>=1;i--)
result[i]=result[i-1];
result[0]='1';
}
return result;
}
};