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;
    }
   
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值