力扣第二题(两数相加)详解

根据题目所给的信息可以很清楚的判断这是一个链表的题目,链表中的数如图所示排列。

 

题目给了很清晰的描述,所以可以直接进行简单的模拟算法,以此来完成该题的解题。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        ListNode *root = new ListNode(0);//创建链表
        ListNode *cursor = root;//创建链表cursor指向链表root
        int carry = 0;//定义一个数记录进位
        while(l1 != nullptr || l2 != nullptr || carry != 0){//循环判断条件
            int l1Val = l1 != nullptr ? l1->val : 0;
            int l2Val = l2 != nullptr ? l2->val : 0;
            int sumVal = l1Val + l2Val + carry;
            carry = sumVal / 10;//将相加得到的数/10,用以进位
            ListNode *sumNode = new ListNode(sumVal % 10);//创建链表储存相加后%10得到的数
            cursor->next = sumNode;//cursor的next指向该链表
            cursor = sumNode;//将sumVal传递给cursor
            if(l1 != nullptr)l1 = l1->next;
            if(l2 != nullptr)l2 = l2->next;
        }
        return root->next;//输出链表
    }
};

 题解的整体思路是先创建一个链表来储存最后的结果,然后创建一个链表来指向该链表,再用一个数carry来记录相加后的进位,该想法的优点是不用判断再复杂的判断是否需要进位。后面就是整体的一个while循环,循环判断的条件是链表l1和l2不为空,且没有进位。循环的里面

            int l1Val = l1 != nullptr ? l1->val : 0;
            int l2Val = l2 != nullptr ? l2->val : 0;
            int sumVal = l1Val + l2Val + carry;
            carry = sumVal / 10;

 是用来将l1和l2的链表中的数和进位carry相加。

            ListNode *sumNode = new ListNode(sumVal % 10);
            cursor->next = sumNode;
            cursor = sumNode;

后面就是将相加所得到的数链表sumNode储存起来。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值