题目描述
描述:给定两个用链表表示的整数,每个节点包含一个数位。
这些数位是反向存放的,也就是个位排在链表首部。
编写函数对这两个整数求和,并用链表形式返回结果。
输入:(7 -> 1 -> 6) + (5 -> 9 -> 2),即617 + 295
输出:2 -> 1 -> 9,即912
输入:(6 -> 1 -> 7) + (2 -> 9 -> 5),即617 + 295
输出:9 -> 1 -> 2,即912
进阶:思考一下,假设这些数位是正向存放的,又该如何解决呢?
解题思路
思路1:最直观的想法是,使用p表示链表1,使用q表示链表2,使用sum表示当前和,使用cur表示当前位,使用add表示进位,使用L存储求和数。首先同时遍历两个链表,对其求和,并创建结点temp存储cur,然后插入到L后面,再将p和q均向后移;接着如果p不为空则遍历p,q不为空则遍历q;最后一定要对add再进行一个判断,因为5和5相加等于10,如果不判断的话结果就是0了。
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2)
{
int sum; //求和
int cur; //当前位
int add=0; //进位
ListNode*p=l1;
ListNode*q=l2;
//求和节点
ListNode *L=new ListNode(0);
L->next=NULL;
ListNode *s=L;
// 共同位
while(p&&q)
{
sum=p->val+q->val+add;
cur=sum%10;
add=sum/10;
ListNode* temp=new ListNode(cur);
s->next=temp;
s=s->next;
p=p->next;
q=q->next;
}
//剩下p不空
while(p)
{
sum=p->val+add;
cur=sum%10;
add=sum/10;
ListNode* temp=new ListNode(cur);
s->next=temp;
s=s->next;
p=p->next;
}
//剩下q不空
while(q)
{
sum=q->val+add;
cur=sum%10;
add=sum/10;
ListNode* temp=new ListNode(cur);
s->next=temp;
s=s->next;
q=q->next;
}
//最后还需要对add进行判断一下 5 5 10
if(add!=0)
{
ListNode* temp=new ListNode(add);
s->next=temp;
s=s->next;
}
s->next=NULL;
return L->next;
}
总结:如果链表正序存储又该怎么办呢?