你有两个用链表代表的整数,其中每个节点包含一个数字。数字存储按照在原来整数中相反的顺序,使得第一个数字位于链表的开头。写出一个函数将两个整数相加,用链表形式返回和。
样例
给出两个链表 3->1->5->null 和 5->9->2->null,返回 8->0->8->null
相加,并记录进位情况
这个没有什么难的,从头开始是个位,然后十位,百位……以此类推,要用一个变量来记录进位情况,这种相加进位最多进1,然后就是,当一个链表加到头就停止(注意处理进位),然后再处理没有加完的那个链表,处理完之后然后再看有没有进位,有的话放在链表最后,链表也写了很久了,这种操作一定要熟练:
虽然很长,但是基本的处理套路都在第一个循环里了,看看就可以了。
ListNode * addLists(ListNode * l1, ListNode * l2) {
// write your code here
ListNode *head=new ListNode(0); //存放结果
ListNode *first;
first=head; //假的表头,主要是把这个地址存起来,这个不动
if(l1==NULL) return l2;
if(l2==NULL) return l1;
int res=0;
int jinwei=0;
while(l1!=NULL&&l2!=NULL)
{
res=l1->val+l2->val+jinwei; //当前位求和
if(res>9) //如果有进位,算出来。
{
res%=10; //取余数
jinwei=1; //进位是1
}
else
jinwei=0; //进位置零
ListNode *temp=new ListNode(res); //生成一个新节点
head->next=temp; //连接到head上
head=head->next; //head向后移动
l1=l1->next; //两个链表向后移动
l2=l2->next;
}
while(l1!=NULL) //如果l1比较长
{
res=l1->val+jinwei;
if(res>9) //处理最后还有进位的情况
{
res%=10;
jinwei=1;
}
else
jinwei=0;
ListNode *temp=new ListNode(res);
head->next=temp; //连接到head上
head=head->next; //head向后移动
l1=l1->next; //两个链表向后移动
}
while(l2!=NULL) //如果l2比较长
{
res=l2->val+jinwei;
if(res>9)
{
res%=10;
jinwei=1;
}
else
jinwei=0;
ListNode *temp=new ListNode(res);
head->next=temp; //连接到head上
head=head->next; //head向后移动
l2=l2->next; //两个链表向后移动
}
cout<<jinwei<<endl;
if(jinwei==1) //最后还有进位的话
{
ListNode *temp=new ListNode(jinwei);
jinwei=0;
head->next=temp; //连接到head上
head=head->next; //head向后移动
}
return first->next;
}