📌  相关文章
📜  C++ 程序减去表示为链接列表的两个数字(1)

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

C++ 程序减去表示为链接列表的两个数字

在这个项目中,我们将编写一个 C++ 程序,用于计算一个链接列表表示的两个数字的差值。我们将在函数中实现这个功能,并通过一些测试用例来验证它的正确性。

问题描述

我们假设输入的两个数字均表示为一个链接列表,其中每个节点表示一个数字的一位。例如,数字 123 可以表示为链表 1->2->3。

我们的任务是计算这两个数字的差值,并将其表示为一个新的链接列表。我们可以假设第一个数字大于或等于第二个数字。

例如,如果输入的数字为:

5->1->3
3->0

我们应该输出:

5->1->0

因为 513 - 30 = 480。

解决方案

为了解决这个问题,我们需要将这两个数字从最高位开始相减,直到两个链表的末尾。如果第一个链表中的数位少于第二个链表中的数位,则可以将不足的数位视为零。

我们可以采用递归算法来实现这一点。在每个节点中,我们需要将两个链表中对应节点的值相减,并考虑前一位的进位。我们将减法结果和进位传递到下一个节点,并在链表结尾处处理最终的进位。

以下是实现方案的代码片段:

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

ListNode* subtract(ListNode* l1, ListNode* l2, int borrow) {
    if (!l1) return NULL;
    int val = l1->val - borrow;
    if (l2) val -= l2->val;
    ListNode* node = new ListNode(val >= 0 ? val : val + 10);
    node->next = subtract(l1->next, l2 ? l2->next : NULL, val < 0 ? 1 : 0);
    return node;
}

ListNode* subtract(ListNode* l1, ListNode* l2) {
    int len1 = 0, len2 = 0;
    for (ListNode* p = l1; p; p = p->next) len1++;
    for (ListNode* p = l2; p; p = p->next) len2++;
    if (len1 < len2) swap(l1, l2);
    ListNode *head = subtract(l1, l2, 0);
    while ( head && !head->val && head->next ) head = head->next; //删除前导零 
    return head;
}
测试用例

以下是一些测试用例,用于验证我们的解决方案是否正确:

  • 输入链表 5->1->33->0,输出链表 5->1->0
  • 输入链表 7->1->62->9->5,输出链表 4->1->1
  • 输入链表 9->91,输出链表 9->8
总结

在这个项目中,我们学习了如何使用链表来表示数字,并使用递归算法计算它们之间的差值。我们实现了一个函数来解决这个问题,并写了一些测试用例来验证它的正确性。