LC 两数相加

题目描述
对比我那又臭又长的代码。。。最后还在最后一个进位过不去。。。
高级的写法真的是高级高级又高级。。。
题目链接

class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        ListNode *head=nullptr,*tail=nullptr;    //先设置2个初始结点,置为空(防止输入即为空)
        int carry=0;   //设置进位
        while(l1||l2)  //两个都遍历到结尾时才结束
        {
            int n1=l1?l1->val:0;   //先判断是否为空,NT:为空则此数在加法中相当于1
            int n2=l2?l2->val:0;   //比先单个循环判断方便多了
            int sum=n1+n2+carry;   //对所求值加和,不能少进位
            if(!head)   head=tail=new ListNode(sum%10);   //当头结点为空时,即为第一次遍历初始情况,对首尾同时创建节点,此时首尾指针是重合的
            else{     //往后遍历时操作尾结点
                tail->next=new ListNode(sum%10);     //直接对总和取余处理,不用判断是否>=10
                tail=tail->next;   //尾指针向后移动
            }
            carry=sum/10;   //直接用运算,不用判断后再用标志变量
            if(l1) l1=l1->next;    //未到结尾时逐步向后遍历
            if(l2) l2=l2->next;
        }
        if(carry>0)  tail->next=new ListNode(carry);     //最后再判断最后一个进位的状态
        return head;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值