/*
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
*/
#include "iostream"
using namespace std;
struct ListNode
{
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
class Solution
{
public:
void print_LinkList(ListNode *l)
{
while (l != NULL)
{
cout << l->val << " ";
l = l->next;
}
cout << endl;
}
ListNode *addTwoNumbers(ListNode *l1, ListNode *l2)
{
int flag = 0, x, y, sum;
ListNode *p = l1, *s = l2, *p_hat, *hat;
// 比较l1和l2长度
while (true)
{
if (p == NULL)
{
p = l2;
s = l1;
break;
}
if (s == NULL)
{
p = l1;
s = l2;
break;
}
p = p->next;
s = s->next;
}
p_hat = p;
while (p->next != NULL)
{
x = p->val;
y = s == NULL ? 0 : s->val;
sum = x + y + flag;
p->val = sum % 10;
flag = sum >= 10 ? 1 : 0;
p = p->next;
if (s != NULL)
{
s = s->next;
}
}
x = p->val;
y = s == NULL ? 0 : s->val;
sum = x + y + flag;
p->val = sum % 10;
if (sum >= 10)
{
p->next = new ListNode(1);
}
return p_hat;
}
};
int main(void)
{
ListNode *p;
int val;
Solution S;
// 输入l1
scanf("%d", &val);
ListNode *l1 = new ListNode(val);
p = l1;
while (true)
{
scanf("%d", &val);
if (val == -1)
{
break;
}
else
{
p->next = new ListNode(val);
p = p->next;
}
}
// S.print_LinkList(l1);
// 输入l2
scanf("%d", &val);
ListNode *l2 = new ListNode(val);
p = l2;
while (true)
{
scanf("%d", &val);
if (val == -1)
{
break;
}
else
{
p->next = new ListNode(val);
p = p->next;
}
}
ListNode *l = S.addTwoNumbers(l1, l2);
S.print_LinkList(l);
}
【Leetcode】2.两数相加C++
猜你喜欢
转载自blog.csdn.net/weixin_44936889/article/details/104056646
今日推荐
周排行