题目描述
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
解法一:
1.统计两链表的长度
2.将长度少的链表补0,使两个链表长度一致
3.进行相加,若有进位则补一个新的节点
对于解法一,根据返回的链表是否是原有的,有两种代码。
在原有链表上操作
/**
* 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) {
int len1=1,len2=1;
ListNode *p=l1,*q=l2;//测量l1,l2长度
while(p->next!=NULL)
{
len1++;
p=p->next;
}
while(q->next!=NULL)
{
len2++;
q=q->next;
}
if (len1>len2)//不足就补0
{
for(int i=1;i<=len1-len2;i++)
{
q->next=new ListNode(0);
q=q->next;
}
}
else
{
for(int i=1;i<=len2-len1;i++)
{
p->next=new ListNode(0);
p=p->next;
}
}
p=l1;
q=l2;
//在原有链表上操作
bool carry=0;//carry 指是否有进位
while(p!=NULL&&q!=NULL)
{
p->val+=carry+q->val;
carry=p->val>=10?true:false;//大于等于10进1
p->val=(p->val)%10;
p=p->next;
q=q->next;
}
p=l1;
if (carry)//最后一个节点是否进位
{
while(p->next!=NULL){p=p->next;}
p->next=new ListNode(1);
}
return l1;
}
};
新建一个链表
/**
* 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) {
int len1=1,len2=1;
ListNode *p=l1,*q=l2;//测量l1,l2长度
while(p->next!=NULL)
{
len1++;
p=p->next;
}
while(q->next!=NULL)
{
len2++;
q=q->next;
}
if (len1>len2)//不足就补0
{
for(int i=1;i<=len1-len2;i++)
{
q->next=new ListNode(0);
q=q->next;
}
}
else
{
for(int i=1;i<=len2-len1;i++)
{
p->next=new ListNode(0);
p=p->next;
}
}
p=l1;
q=l2;
ListNode* l3=new ListNode(-1);//创建新的链表
ListNode* r=l3;
bool carry=0;
int temp=0;
while(p!=NULL&&q!=NULL)
{
temp=carry+p->val+q->val;
r->next=new ListNode(temp%10);//过10补一
carry=temp>=10?true:false;
r=r->next;
p=p->next;
q=q->next;
}
if (carry)
{
r->next=new ListNode(1);
r=r->next;
}
return l3->next;
}
};
方法二:
不对齐补零,若链表不为空,则进行操作,考虑进位。
/**
* 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) {
ListNode*l3=new ListNode(-1);//新建一个链表
ListNode*r=l3;
bool carry=0;//进位
while(l1!=NULL||l2!=NULL)
{
int temp=0;//存储每位相加的结果
if (l1!=NULL)
{
temp+=l1->val;
l1=l1->next;
}
if (l2!=NULL)
{
temp+=l2->val;
l2=l2->next;
}
if (carry)
{
temp++;
}
r->next=new ListNode(temp%10);
carry=temp>=10?true:false;
r=r->next;
}
if (carry)//若最后一个节点存在进位
{
r->next=new ListNode(1);
}
return l3->next;
}
};