167. 链表求和

你有两个用链表代表的整数,其中每个节点包含一个数字。数字存储按照在原来整数中相反的顺序,使得第一个数字位于链表的开头。写出一个函数将两个整数相加,用链表形式返回和。
样例
给出两个链表 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<next=temp;         //连接到head上
            head=head->next;       //head向后移动
        }
        return  first->next;
    
    }

你可能感兴趣的:(167. 链表求和)