📌  相关文章
📜  C++ 程序添加由链表表示的两个数字 - 集 1(1)

📅  最后修改于: 2023-12-03 14:59:49.479000             🧑  作者: Mango

C++程序添加由链表表示的两个数字 - 集 1

链表是一种常用的数据结构,用于表示各种复杂的问题。本题要求我们实现一个C++程序,在链表中表示两个数字,然后将它们相加,最后返回一个新链表表示结果。

问题描述

给定两个由链表表示的非负整数,每个节点表示其中的一位数字,按逆序顺序排列(也就是个位在前,最高位在最后)。请将这两个数相加并以链表形式返回。

例如:

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

解题思路

对于一个链表定义,通常都需要声明一个结构体来代表节点。我们可以定义一个LinkedListNode结构体,包含一个value成员表示当前节点的数值,以及一个next指针成员表示后继节点。

struct LinkedListNode {
    int value;
    LinkedListNode* next;
    LinkedListNode(int val) : value(val), next(NULL) {}
};

我们可以定义两个指针,分别指向两个链表的头节点。然后,我们从两个链表的头节点开始遍历,依次将对应的数字相加,并且需要考虑进位。最后,我们将所有的求和结果通过节点相连形成一个新链表,也可以使用虚拟头节点来简化实现。

LinkedListNode* addTwoNumbers(LinkedListNode* l1, LinkedListNode* l2) {
    LinkedListNode *p1 = l1, *p2 = l2, *dummy = new LinkedListNode(0), *curr = dummy;
    int carry = 0;
    while (p1 || p2 || carry) {
        int val1 = p1 ? p1->value : 0;
        int val2 = p2 ? p2->value : 0;
        int sum = val1 + val2 + carry;
        carry = sum / 10;
        curr->next = new LinkedListNode(sum % 10);
        curr = curr->next;
        if (p1) p1 = p1->next;
        if (p2) p2 = p2->next;
    }
    return dummy->next;
}
完整代码
struct LinkedListNode {
    int value;
    LinkedListNode* next;
    LinkedListNode(int val) : value(val), next(NULL) {}
};

LinkedListNode* addTwoNumbers(LinkedListNode* l1, LinkedListNode* l2) {
    LinkedListNode *p1 = l1, *p2 = l2, *dummy = new LinkedListNode(0), *curr = dummy;
    int carry = 0;
    while (p1 || p2 || carry) {
        int val1 = p1 ? p1->value : 0;
        int val2 = p2 ? p2->value : 0;
        int sum = val1 + val2 + carry;
        carry = sum / 10;
        curr->next = new LinkedListNode(sum % 10);
        curr = curr->next;
        if (p1) p1 = p1->next;
        if (p2) p2 = p2->next;
    }
    return dummy->next;
}