題目描述
給出兩個 非空 的鏈表用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式存儲的,並且它們的每個節點只能存儲 一位 數字。
如果,我們將這兩個數相加起來,則會返回一個新的鏈表來表示它們的和。
您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。
示例:
輸入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
輸出:7 -> 0 -> 8
原因:342 + 465 = 807
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/add-two-numbers
思路解析
先提取關鍵信息:兩個整數
,非負
,逆序存儲
,按位存儲
,實現不同位數相加
首先分析程序流程應當如下:
因爲題目只讓寫核心算法,所以這裏只寫核心算法,即addTwoNumbers()函數,其餘數據處理請詳見代碼
- 考慮到兩個鏈表的數字位數可能不一樣,而運算是否停止取決於位數大的數字,因此在做相加時,判斷條件爲兩個鏈表任意一個不爲空,則運算繼續
- 對於123+123這種,不需要考慮進位,而像123+996這種,需要考慮進位的問題,因此在做相加時,判斷條件爲進位是否爲0,因此應該設置一個變量carry記錄進位
從而得出限制條件爲 l1 != 0 || l2 != 0 || carry != 0
在此條件下逐位相加,每加一次,就將結果放入result節點,但是直接放不行,因爲sum = 7+8 = 15,每個節點只能存儲一位數字,因此利用sum%10記錄進位後個位上的數,利用sum/10向carry傳遞進位數據,最終將結果存入新鏈表並返回
代碼:
#include <bits/stdc++.h>
using namespace std;
//節點類
class ListNode
{
public:
int val;
ListNode *next;
ListNode() {}
ListNode(int x):val(x),next(nullptr) {}
ListNode* Insert(string str,ListNode *l)
{
ListNode *s,*r = l;
for(auto &x : str)
{
if(isdigit(x))
{
s = new ListNode();
s->val=x-'0';
r->next=s;
r=s;
}
}
r->next = NULL;
return l;
}
};
//核心算法類
class Solution
{
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2)
{
ListNode *tmp = nullptr;
ListNode *result = nullptr;
int carry = 0;
while(l1 != nullptr || l2 != nullptr ||carry != 0)
{
int sum = (l1 == nullptr ? 0:l1->val) + (l2 == nullptr ? 0:l2->val) + carry;
carry = sum/10;
ListNode *node = new ListNode(sum%10);
if(tmp == nullptr)
{
tmp = node;
result = tmp;
}
else
{
tmp->next = node;
tmp = tmp->next;
}
l1 = l1 == nullptr ? nullptr:l1->next;
l2 = l2 == nullptr ? nullptr:l2->next;
}
return result;
}
};
//按照 + 將字符串分割爲兩部分
vector<string> split(const string &str, const string &pattern)
{
vector<string> res;
if(str == "")
return res;
string strs = str + pattern;
size_t pos = strs.find(pattern);
while(pos != strs.npos)
{
string temp = strs.substr(0, pos);
res.push_back(temp);
strs = strs.substr(pos+1, strs.size());
pos = strs.find(pattern);
}
return res;
}
int main()
{
char s[1000];
cin.getline(s,50);
vector<string> result = split(s,"+");
ListNode *l1 = new ListNode();
l1->Insert(result[0],l1);
ListNode *l2 = new ListNode();
l2->Insert(result[1],l2);
Solution Sve;
ListNode *res = Sve.addTwoNumbers(l1->next,l2->next);
cout<<res->val<<" -> "<<res->next->val<<" -> "<<res->next->next->val;
return 0;
}
Sve.addTwoNumbers(l1->next,l2->next);
cout<<res->val<<" -> "<<res->next->val<<" -> "<<res->next->next->val;
return 0;
}