445. 两数相加 II
给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。
你可以假设除了数字 0 之外,这两个数字都不会以零开头。
解题思路: 这题解法非常灵活,但是有个注意点,如果打算先把两个链表表示的数求出来,然后直接相加,这里可能存在大数相加的问题,解决这个问题,要么直接着手解决大数相加问题,要么将两个链表的各个节点表示的数保持在栈中,然后边相加变生成结果链表。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
string getNumberFromLink(ListNode* h) {
string res = "";
while (h) {
res.push_back(h->val + '0');
h = h->next;
}
return res;
}
string add(string a, string b) {
int sum = 0, carry = 0, i, j;
string res = "";
for (i = a.size() - 1, j = b.size() - 1 ; i >= 0 && j >= 0; --i, --j) {
sum = a[i] - '0' + b[j] - '0' + carry;
res.push_back(sum % 10 + '0');
carry = sum / 10;
}
while (i >= 0) {
sum = a[i--] - '0' + carry;
res.push_back(sum % 10 + '0');
carry = sum / 10;
}
while (j >= 0) {
sum = b[j--] - '0' + carry;
res.push_back(sum % 10 + '0');
carry = sum / 10;
}
if (carry) res.push_back('1');
return res;
}
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
string num = add(getNumberFromLink(l1), getNumberFromLink(l2));
ListNode* dummy = new ListNode(-1), *cur = dummy->next;
for (int i = 0; i < num.size(); ++i) {
ListNode* p = new ListNode(num[i] - '0');
dummy->next = p;
p->next = cur;
cur = dummy->next;
}
ListNode* res= dummy->next;
delete dummy;
return res;
}
};