leetcode#2 两数相加
一.题目
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
二.思路
2.1链表-》数-》链表
usigned long long int都hold不住
用long long int
10 * 1000000000000000000 overflow
unsigned long long int上溢
class Solution {
public:
unsigned long long int sumf(ListNode* &l1, ListNode* &l2)
{
unsigned long long a(0);
if(l2==NULL&&l1==NULL)
return 0;
if((l1==NULL)&&(l2!=NULL))
return a=l2->val+10*sumf(l1,l2->next);
if(l2==NULL&&l1!=NULL)
return a=l1->val+10*sumf(l1->next,l2);
return a=l1->val+l2->val+10*sumf(l1->next,l2->next);
}
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2)
{
unsigned long long int sum=sumf(l1,l2);
ListNode* l3=new ListNode;
ListNode*pointer=l3;
/*if(sum==-1)
{
int i=0;
for(;i<10;i++)
{ pointer->next=new ListNode;
pointer=pointer->next;//若pointer移动new ListNode会与l3连不上
}
pointer->val=1;
return l3;
}*/
while(sum!=0)
{
pointer->val=sum%10;
sum/=10;
if(sum==0)//否则多个0
break;
pointer->next=new ListNode;
pointer=pointer->next;
}
return l3;
}
};
usigned long long int都hold不住
2.2进位法
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2)
{
ListNode* l3=new ListNode;//防止p为空,连不上
ListNode* p=l3;
int sum(0),temp(0);//temp用来进位
bool first(true);
while(l1!=NULL||l2!=NULL||temp!=0)
{
if(l1!=NULL&&l2!=NULL)
{
sum=l1->val+l2->val+temp;
l1=l1->next;
l2=l2->next;
}
else if(l1==NULL)
{
if(l2==NULL)
{
sum=0+temp;
}
else
{
sum=l2->val+temp;
l2=l2->next;
}
}
else if(l2==NULL)
{
sum=l1->val+temp;
l1=l1->next;
}
temp=sum/10;
p->next=new ListNode(sum%10);
p->next->val=sum%10;
p=p->next;
}
return l3->next;
}
};