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

📅  最后修改于: 2023-12-03 15:40:54.786000             🧑  作者: Mango

用于添加由链表表示的两个数字的 C 程序 - 集 2

在这篇文章中,我们将介绍用于添加由链表表示的两个数字的 C 程序。这是链表的第二集,如果您还没有阅读过第一集,请先移步 用于表示数字的链表的 C 程序 - 集 1

题目描述

给定两个用链表表示的非负数,其中每个节点包含一个数字,请将两数相加并以链表的形式返回。

示例:

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)

输出:7 -> 0 -> 8

实现思路

我们可以采取与第一节列举的思路相同,从头到尾遍历两个链表,同时将两个节点的值相加,并将结果保存到新链表中。值得注意的是,在添加新节点时,为了防止悬挂指针,必须保证链表节点的内存分配是连续的。

算法步骤:

  1. 初始化一个进位值carry,以及一个空的结果链表。
  2. 遍历两个链表,直到它们的头指针都为空。
  3. 在每个节点处,将节点值相加,并将上一步的进位值加起来。
  4. 计算总和后,将最后一位插入到结果链表中。
  5. 更新进位值。
  6. 最后,如果进位值不为0,我们必须在答案链表中添加一个新节点。
代码实现

接下来,我们将按照 C 语言的语法,编写一个解决这个问题的程序。具体代码片段如下:

struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {
    struct ListNode dummy;
    struct ListNode* tail = &dummy;
    int carry = 0;

    while (l1 || l2 || carry) {
        int sum = (l1 ? l1->val : 0) + (l2 ? l2->val : 0) + carry;
        carry = sum / 10;
        tail->next = malloc(sizeof(struct ListNode));
        tail = tail->next;
        tail->val = sum % 10;
        l1 = l1 ? l1->next : NULL;
        l2 = l2 ? l2->next : NULL;
    }

    tail->next = NULL;
    return dummy.next;
}
总结

这是一个用于添加由链表表示的两个数字的简单 C 程序。我们通过一个简单的步骤,实现了从头到尾遍历两个链表,同时将节点的值相加的过程,并将结果保存在新链表中,最后返回新链表。

感谢您的阅读!