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

来源:互联网 发布:c语言编Newton 编辑:程序博客网 时间:2024/05/23 01:14

题干

这里写图片描述

原题网址:
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;    }};
原创粉丝点击