题目描述
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例 1:
算法分析
模拟加法运算
完整代码
/**
* 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) {}
* };
*/
class Solution {
public:
void Insert_tail(ListNode* head, int val) {
auto p = new ListNode(val);
auto q = head;
for (; q->next != NULL; q = q->next) {
;
}
p->next = q->next;
q->next = p;
}
string add(string a, string b) {
string result; // 返回的结果字符串
int carry = 0; // 进位
int i = a.length() - 1; // 下标
int j = b.length() - 1; // 下标
while (i >= 0 || j >= 0 || carry != 0) {
int sum = carry;
if (i >= 0) {
sum +=
a[i--] - '0'; // 数字+字符‘0’[在计算机中以ASCII码存储]==字符
}
if (j >= 0) {
sum += b[j--] - '0';
}
result.push_back(sum % 10 + '0'); // 缝10进一
carry = sum / 10; // 如果sum是2就+1到下一位
}
reverse(result.begin(), result.end()); // 反转
return result;
}
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
string a, b;
int len1 = 0;
int len2 = 0;
for (auto p = l1; p != NULL; p = p->next) {
len1++;
a.push_back((p->val) + '0');
}
for (auto p = l2; p != NULL; p = p->next) {
len2++;
b.push_back((p->val) + '0');
}
reverse(a.begin(), a.end());
reverse(b.begin(), b.end());
// 在相加的时候,两个数字相加会溢出,需要处理
// long long ans=stoll(a)+stoll(b);//error
// 转化为两数相加
string c = add(a,b);
vector<int> v;
for (auto i : c) {
v.push_back(i - '0');
}
// 需要再把v当中的内容反转
int i = 0;
int j = v.size() - 1;
while (i < j) {
int tmp = v[i];
v[i] = v[j];
v[j] = tmp;
i++;
j--;
}
// 创建v的长度个的链表,然后把数值放进去
auto head = new ListNode(0);
for (int i = 0; i < v.size(); i++) {
Insert_tail(head, v[i]);
}
return head->next;
}
};