LeetCode#2 Add Two Numbers题解(C++版)

题干

这里写图片描述

原题网址:
https://leetcode.com/problems/add-two-numbers/description/

题干解析

给你两个非空链表,要你把他们“加”起来,并且返回答案链表。所谓的加就是每对应的两个节点数相加,要注意到的是,答案不能超过10,只有一位数,而如果超过10的话要进位。

知识点

数据结构之链表

难度

中等

解题思路

这道题主要考察对链表的熟悉程度,主要就是对新节点的生成,添加进原链表的操作的训练,其它的注意一下进位的要求。从两个链表的第一节点开始往后加,每到一个新的节点要给答案生成一个新的节点,当某个节点被加完时,要检测另一个节点是否被加完,如果没有,剩下的操作就是将未被加完的链表的节点加入答案中,同样要注意进位。代码里注释得比较清楚,详细解题思路请见代码。

代码

class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        ListNode *ans;  // 答案的头指针
        bool flag = false;  // 标记是否有进位
        int sum = l1->val + l2->val;
        if (sum >= 10) {  // 因为都是1位数,所以十位的数要舍去,保留个位数,但是要标记有进位
            sum -= 10;
            flag = true;
        }
        ListNode *temp = new ListNode(sum);  // 新生成一个节点
        ans = temp;  // 将该节点赋给头指针
        while (l1->next != NULL && l2->next != NULL) {  // 如果两个链表都不为空的话
            l1 = l1->next;
            l2 = l2->next;
            int sum = l1->val + l2->val;
            if (flag) {  // 如果之前有进位
                sum++;   // 把进位的1加到当前位
                flag = false;
            }
            if (sum >= 10) {  // 如果大于10,要舍去十位数,保留个位数,并标记有进位
                sum -= 10;
                flag = true;
            }
            ListNode *next_temp = new ListNode(sum);  // 新建一个节点
            temp->next = next_temp;  // 将该节点插到原链的尾部
            temp = next_temp;
        }
        if (l1->next != NULL) {  // 如果l1还没有加完而l2加完了,接下里要将l1的东西加给答案
            while (l1->next != NULL) {
                l1 = l1->next;
                int val = l1->val;
                if (flag) {
                    val++;
                    flag = false;
                }
                if (val >= 10) {
                    val -= 10;
                    flag = true;
                }
                ListNode *next_temp = new ListNode(val);
                temp->next = next_temp;
                temp = next_temp;
            }
        } else if (l2->next != NULL) {  // 如果l2还没有加完而l1加完了,接下里要将l2的东西加给答案
            while (l2->next != NULL) {
                l2 = l2->next;
                int val = l2->val;
                if (flag) {
                    val++;
                    flag = false;
                }
                if (val >= 10) {
                    val -= 10;
                    flag = true;
                }
                ListNode *next_temp = new ListNode(val);
                temp->next = next_temp;
                temp = next_temp;
            }
        }
        if (flag) {  // 如果l1和l2都加完了,检查是否还有进位,有的话,还要再加一个值为1的节点。
            ListNode *next_temp = new ListNode(1);
            temp->next = next_temp;
            temp = next_temp;
        }
        return ans;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值