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

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

C程序添加由链表表示的两个数字

在计算中,我们经常需要将两个数字相加。在某些情况下,数字可能非常大,以至于超出了计算机可以表示的整数范围。在这种情况下,我们可以使用链表来表示数字并计算它们的和。

链表概念及其实现

链表是一种数据结构,用于存储和操作元素的集合。每个元素称为节点,并包含1)表示数据的值和2)连接到下一个节点的指针。链表可以用于表示数字,其中每个节点来代表数字的一位。

链表有许多类型,其中较常见的是单链表、双链表和循环链表。下面是单链表的结构体的定义:

typedef struct ListNode {
    int val;
    struct ListNode *next;
} ListNode;

以上代码片段说明了单链表节点的结构体:每个节点由和指向下一节点的指针组成。其中,*next指针可以为空,从而表示链表尾部。

思路

为了将两个链表表示的数字相加,我们需要执行以下步骤:

  1. 创建一个新的头节点。
  2. 遍历每个链表中的节点,将数字相加并构建新节点。
  3. 将新节点连接到新的链表中。
  4. 返回新的头节点的next指针,它将指向新链表的第一个节点。
代码实现
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
    ListNode *head = new ListNode(-1);
    ListNode *curr = head;
    int carry = 0;
    
    while (l1 || l2 || carry) {
        int sum = (l1 ? l1->val : 0) + (l2 ? l2->val : 0) + carry;
        carry = sum / 10;
        curr->next = new ListNode(sum % 10);
        curr = curr->next;
        l1 = l1 ? l1->next : NULL;
        l2 = l2 ? l2->next : NULL;
    }
    
    return head->next;
}
代码解读
  1. 首先我们创建一个新的头节点并将其赋值为-1,因为我们不会用到它的值。同时,我们也创建另外两个指针currcarry,用于遍历链表和计算进位。
  2. 然后,我们进入while循环,该循环将l1和l2中节点的值相加并存储在新节点中,直到l1和l2的节点都已遍历完毕。
  3. 我们要记住,这两个数字可能不同长,因此我们需要判断节点是否为空。如果不是,则我们只遍历到该节点为止。否则,我们将节点的值赋值为0。
  4. 我们将两个节点的值加起来,并将它们与进位相加。现在,我们应该得到两个数字之和,并且还需要在头节点中存储进位。
  5. 然后,我们创建一个新节点并将其值设置为数字之和的个位数。我们将新节点连接到新的链表中。
  6. 接下来,我们将curr指向新节点,l1和l2分别指向它们的下一个节点或者NULL,以便将它们移动到下一个节点并继续下一次迭代。
  7. 循环结束时,我们返回新头节点的next指针,它将指向新链表的第一个节点。
总结

使用链表相加两个数字可能有一些难点,但是如果我们按照上述步骤操作,就可以轻松地完成它。在实现代码时,我们要记得一些重要的锚点,如链表的头节点和尾节点,以及我们需要跟踪的进位。