给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-two-numbers
#include <iostream>
#include <cstring>
#include <string>
using namespace std;
struct ListNode {
int val;
ListNode* next;
ListNode(int x) : val(x), next(NULL) {}
};
ListNode* LinkList(int n) {
ListNode* p = NULL;
for (int i = 0; i < n; i++)
{
ListNode* s = new ListNode(0);
int in = 0;
cin >> in;
s->val = in;
s->next = p;
p = s;
}
return p;
}
void PrintList(ListNode* p)
{
while (p != NULL) {
cout << p->val;
p = p->next;
}
cout << endl;
}
int LengthList(ListNode* p)
{
int length = 0;
while (p != NULL) {
length++;
p = p->next;
}
return length;
}
ListNode* reversalList(ListNode* p)
{
ListNode* newp = NULL;
ListNode* n;
while (p!=NULL)
{
n = p;
p = p->next;
n->next = newp;
newp = n;
}
return newp;
}
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
int len1 = 0;
int len2 = 0;
int len = 0;
int flag = 0;
ListNode* p = NULL;
len1 = LengthList(l1);
len2 = LengthList(l2);
if (len1 > len2)
len = len1;
else
len = len2;
for (int i = 0; i < len; i++)
{
ListNode* s = new ListNode(0);
s->val = l1->val + l2->val + flag;
flag = 0;
if (s->val >= 10)
{
s->val = s->val - 10;
flag = 1;
}
s->next = p;
p = s;
l1 = l1->next;
l2 = l2->next;
if (l1 == NULL)
{
l1 = new ListNode(0);
}
if (l2 == NULL)
{
l2 = new ListNode(0);
}
}
if (flag == 1)
{
ListNode* s = new ListNode(0);
s->val = flag;
s->next = p;
p = s;
}
return (reversalList(p));
}
int main()
{
ListNode* first1 = NULL;
ListNode* first2 = NULL;
ListNode* first3 = NULL;
first1 = LinkList(2);
first2 = LinkList(1);
first3 = addTwoNumbers(first1, first2);
PrintList(first1);
PrintList(first2);
PrintList(first3);
return 0;
}