leetcode题解系列-001 两数相加

直接上题目和代码,最后面有解题思路分析。

//
// Created by tannzh on 2020/6/9.
//

/*
 给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,
 并且它们的每个节点只能存储 一位 数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
 您可以假设除了数字 0 之外,这两个数都不会以 0 开头。

示例:
    输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
    输出:7 -> 0 -> 8
    原因:342 + 465 = 807
 */

#include 
#include 

struct ListNode {
    int val;
    ListNode *next;
    ListNode(int x) : val(x), next(nullptr) {}
};

class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        ListNode result(0), *tail = &result;

        for(div_t sum{0, 0}; sum.quot || l1 || l2; tail = tail->next){
            if(l1) {
                sum.quot += l1->val; // 进位 + l1
                l1 = l1->next;
            }
            if(l2) {
                sum.quot += l2->val; // 进位 + l2
                l2 = l2->next;
            }

            sum = div(sum.quot, 10); // 除 10 操作,得到新的 quot 与 rem.
            tail->next = new ListNode(sum.rem);
        }

        return result.next;
    }
};

ListNode *create_list(std::initializer_list list)
{
    auto iter = list.begin();
    ListNode *head = list.size()? new ListNode(*iter++): nullptr;

    for(ListNode *curr = head; iter != list.end(); curr = curr->next){
        curr->next = new ListNode(*iter++);
    }

    return head;
}

int main(int argc, char **argv)
{
    Solution s;

    ListNode *l1 = create_list({2, 4, 3});
    ListNode *l2 = create_list({5, 6, 4});
    ListNode *result = s.addTwoNumbers(l1, l2);

    for (ListNode *cur = result; cur; cur = cur->next)
        std::cout << cur->val << "->";
    std::cout << "\b\b  " << std::endl;

    return 0;
}

解题思路

leetcode题解系列-001 两数相加_第1张图片

 

-----
具体说一下进位的事情。
STL 有一个专门的结构体叫做 `div_t`, 其包含两个成员,分别是 quot(quotient) 与 rem(remainder). 用来做什么,从命名上是否可以看出一点端倪呢?
举例说明.
38 / 5 == 7 remainder 3
用 C++ 来描述,便是:
div_t result = div(38, 5); cout << result.quot << result.rem;
前者为被除后的结果,后者为余数。
-----

本题的进位是基于十进制的,故两个节点相加之后的值,应判断是否超出了10,超出需要进位,留下的是余数。即,做了 div 操作后。sum.rem 是新链表的当前节点,sum.quot 是下一次加法运算的进位。

你可能感兴趣的:(leetcode题解系列)