您的位置:首页 > 其它

LeetCode题目----两数相加

2019-05-30 11:13 337 查看

给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。

如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

您可以假设除了数字 0 之外,这两个数都不会以 0 开头。

示例:

[code]输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807

两种方法:

方法一:先写一个函数get可以得到任何一个链表所存储的整数,然后再写一个函数save可以将任何整数存储到链表中,在最后的函数里边分别调用这两个函数即可完成任务,缺陷就是用这个方法会出现溢出问题,整数不能太大。

[code]#inlcude<cmath>

class Solution {
public:
int get(ListNode* ll)
{//
double a = 0;
int i = 0;
if (ll == NULL)
return -1;

while (ll != NULL)
{
a += pow(10, i)*(ll->val);
ll = ll->next;
i++;

}
return a;

}

ListNode* save(int n)
{
ListNode* l = new ListNode(0);
ListNode* p = l;

if (n<10)
{
l->val = n;
return l;
}
l->val = n % 10;
n = (n - n % 10) / 10;

while (n)
{
// p->next=new ListNode(0)
p->next = new ListNode(n % 10);
p = p->next;
n = (n - n % 10) / 10;
}
return l;

}
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2)
{
int n = get(l1) + get(l2);
return save(n);
}
};

方法二:从链表头到尾,按照加法法则来完成任务。

[code]/**
* Definition for singly-linked list.
* struct ListNode {
*     int val;
*     ListNode *next;
*     ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
if(l1==NULL||l2==NULL)
return NULL;
ListNode* daan=new ListNode(0);

ListNode* p = daan;

int sum=0;

int dev=0;

while(l1||l2||dev)
{
if(l1)
sum+=l1->val;
if(l2)
sum+=l2->val;

p->next = new ListNode((sum+dev)%10);
p=p->next;
if(sum+dev>=10)
dev = 1;
else
dev = 0;
sum=0;

if(l1) l1=l1->next;
if(l2) l2= l2->next;
}
return daan->next;

}
};

 

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: