【Leetcode】2.两数相加C++

在这里插入图片描述

在这里插入图片描述

/*
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。

如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
*/
#include "iostream"

using namespace std;

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

class Solution
{
public:
    void print_LinkList(ListNode *l)
    {
        while (l != NULL)
        {
            cout << l->val << " ";
            l = l->next;
        }
        cout << endl;
    }

    ListNode *addTwoNumbers(ListNode *l1, ListNode *l2)
    {
        int flag = 0, x, y, sum;
        ListNode *p = l1, *s = l2, *p_hat, *hat;

        // 比较l1和l2长度
        while (true)
        {
            if (p == NULL)
            {
                p = l2;
                s = l1;
                break;
            }
            if (s == NULL)
            {
                p = l1;
                s = l2;
                break;
            }
            p = p->next;
            s = s->next;
        }

        p_hat = p;

        while (p->next != NULL)
        {
            x = p->val;
            y = s == NULL ? 0 : s->val;
            sum = x + y + flag;

            p->val = sum % 10;
            flag = sum >= 10 ? 1 : 0;

            p = p->next;
            if (s != NULL)
            {
                s = s->next;
            }
        }

        x = p->val;
        y = s == NULL ? 0 : s->val;
        sum = x + y + flag;

        p->val = sum % 10;

        if (sum >= 10)
        {
            p->next = new ListNode(1);
        }

        return p_hat;
    }
};

int main(void)
{
    ListNode *p;
    int val;
    Solution S;

    // 输入l1
    scanf("%d", &val);
    ListNode *l1 = new ListNode(val);
    p = l1;
    while (true)
    {
        scanf("%d", &val);
        if (val == -1)
        {
            break;
        }
        else
        {
            p->next = new ListNode(val);
            p = p->next;
        }
    }
    // S.print_LinkList(l1);

    // 输入l2
    scanf("%d", &val);
    ListNode *l2 = new ListNode(val);
    p = l2;
    while (true)
    {
        scanf("%d", &val);
        if (val == -1)
        {
            break;
        }
        else
        {
            p->next = new ListNode(val);
            p = p->next;
        }
    }
    ListNode *l = S.addTwoNumbers(l1, l2);
    S.print_LinkList(l);
}
发布了64 篇原创文章 · 获赞 121 · 访问量 9011

猜你喜欢

转载自blog.csdn.net/weixin_44936889/article/details/104056646