数据结构--链表系列 两个数相加

3 篇文章 0 订阅
1 篇文章 0 订阅

一、题目

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

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

您可以假设除了数字 0 之外,这两个数都不会以 0 开头。

示例:

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

二、分析

思路分析

1.每个链表的每个节点是一位数字,也就是取值在[0,9],由此可以知道两数之和最大进位为1

2.链表的每个节点组成的数字,是链表从尾到头组成的一个数字

3.求两个数的和是从低位到高位的,而链表的头部正好代表了数的低位,于是可以正向遍历链表,并且边遍历边求和

4.在求和过程中需要考虑进位,如果和小于10,则直接将节点添加到返回链表

5.如果和大于10,则需要对10取余作为节点的值,将进位计入下一次求和中

6.如果某一个链表先结束,如果c==0,直接将另一个链表挂到返回链表中

7.如果c!=0,则需要重复上述求和的过程

8.最后需要考虑,如果最高位求和后大于10,需要新增加一位,添加到链表上

9.上述思路是为了方便思考,在代码实现的时候可以优化,不需要分这么多情况,可以将两个链表的长度考虑成一样的,没有的话在做求和的时候补0.

三、代码

ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        //分析:链表的头部表示数字的低位,求和的时候从低位到高位开始求和,因此直接从头部开始遍历两个链表
        //每一位的数字范围是0-9,和最大为18,当前的和进位最高位1
        // 直接相加两个节点的值,如果小于10,直接创建一个新的节点,开辟新的空间存放结果
        //如果和大于10,则对10求余,将余数的结果存放到新的节点空间,保存进位的值
        // 直到某一个链表结束,如果没有进位,直接将另外一个链表的剩余节点加到当前res
        //如果有进位,则将长链表的下一个节点加上进位,判断是否有进位,还有进位继续加,没有进位执行上一步

        //为了便于操作,给返回的链表加上一个哨兵头结点,返回直接返回该结点的next
        ListNode* res = new ListNode(-1);
        res->next = nullptr;
        ListNode* cur = res;//res需要一个遍历结点,加入结点之间的位置关系
        
        int c = 0;//表示进位
        while (l1 || l2) {
            //创建一个结点,用于存放结果值
            ListNode* node = new ListNode(-1);
            node->next = nullptr;
               
            //计算当前结点的值,需要加上进位
            //这里相当于是把两个链表考虑成节点数一样的,通过补0来实现
            int num1=l1?l1->val:0;
            int num2=l2?l2->val:0;
            int temp = num1 + num2 + c;
            node->val = temp % 10;//个位数
            c = temp / 10;//进位数
            cur->next = node;//定义了哨兵结点,所以可以统一直接next
            cur = cur->next;

            //最后将两个链表依次后移
            if(l1) l1 = l1->next;
            if(l2) l2 = l2->next;
        }

        if (c != 0) {
            ListNode* node = new ListNode(c);
            node->next = nullptr;
            cur->next = node;
        }
        return res->next;
    }

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 好的,这是一个非常常见的问题。对于多项式相加,我们可以使用链表来存储每个项的系数和指数。具体的步骤如下: 1. 定义一个链表结构体,每个节点包含个成员变量:系数和指数。 ``` struct Node { int coeff; int exp; Node *next; }; ``` 2. 定义一个函数来创建一个表示多项式的链表。这个函数接受一个整数数组,每个元素表示一个项的系数,数组下标表示项的指数。 ``` Node* createPoly(int arr[], int n) { Node *head = new Node(); head->next = NULL; Node *tail = head; for (int i = 0; i < n; i++) { Node *node = new Node(); node->coeff = arr[i]; node->exp = i; node->next = NULL; tail->next = node; tail = node; } return head; } ``` 3. 定义一个函数来实现个多项式相加。这个函数接受个多项式的链表作为参数,并返回一个新的链表表示它们的和。 ``` Node* addPoly(Node *poly1, Node *poly2) { Node *head = new Node(); head->next = NULL; Node *tail = head; while (poly1 && poly2) { if (poly1->exp == poly2->exp) { Node *node = new Node(); node->coeff = poly1->coeff + poly2->coeff; node->exp = poly1->exp; node->next = NULL; tail->next = node; tail = node; poly1 = poly1->next; poly2 = poly2->next; } else if (poly1->exp > poly2->exp) { Node *node = new Node(); node->coeff = poly1->coeff; node->exp = poly1->exp; node->next = NULL; tail->next = node; tail = node; poly1 = poly1->next; } else { Node *node = new Node(); node->coeff = poly2->coeff; node->exp = poly2->exp; node->next = NULL; tail->next = node; tail = node; poly2 = poly2->next; } } while (poly1) { Node *node = new Node(); node->coeff = poly1->coeff; node->exp = poly1->exp; node->next = NULL; tail->next = node; tail = node; poly1 = poly1->next; } while (poly2) { Node *node = new Node(); node->coeff = poly2->coeff; node->exp = poly2->exp; node->next = NULL; tail->next = node; tail = node; poly2 = poly2->next; } return head->next; } ``` 这样,我们就实现了用链表来存储和操作多项式的算法。 ### 回答2: 数据结构中的多项式相加可以使用链表来实现。链表是一种非连续的存储结构,由节点组成,每个节点包含部分内容:数据元素和指针,指针指向下一个节点。而多项式的每一项包含系数和指数,因此可以用链表的节点来表示多项式的每一项。 具体实现时,可以创建一个链表来表示多项式。链表的每个节点包含个属性,一个是系数,一个是指数。可以按照指数的大小顺序来插入节点,这样链表就可以按照指数从小到大的顺序来表示多项式。插入节点时,可以比较要插入的节点的指数与已有节点的指数大小,找到合适的位置插入节点。 多项式相加时,可以遍历链表,并按照指数大小逐项相加。如果链表中的节点指数相同,可以将节点的系数相加,并创建一个新的节点来存储相加的结果。如果链表中的节点指数不同,可以将较小的指数的节点插入到结果链表中,并继续遍历较大指数节点所在的链表。 最后,得到的结果链表就表示了多项式们的相加结果。 总结起来,使用链表来表示多项式可以通过节点的方式来存储系数和指数,按照指数的大小顺序插入节点,并且可以按照指数的大小相加个多项式,最终得到结果链表。 ### 回答3: 数据结构中的多项式相加可以使用链表来实现。链表是一种常用的数据结构,它由一系列节点组成,每个节点都包含一个数据元素和指向下一个节点的指针。 在多项式相加中,我们可以将多项式的每一项作为链表的一个节点来表示。节点的数据元素可以包含多项式中的系数和指数。为了方便操作,我们可以按照指数的大小将链表中的节点按顺序排列。 具体实现上,我们可以创建一个空链表用来存储相加后的结果。然后,遍历个多项式链表,比较当前节点的指数大小,根据指数的大小关系进行相应的操作。若个节点的指数相等,则将系数相加,并将结果作为新节点添加到结果链表中;若节点1的指数小于节点2的指数,则将节点1添加到结果链表中,并移动指向节点1的指针;若节点1的指数大于节点2的指数,则将节点2添加到结果链表中,并移动指向节点2的指针。 最后,当遍历完个多项式链表后,如果一个链表还有剩余节点,则将剩余节点直接添加到结果链表的末尾。 通过以上步骤,我们就可以得到个多项式相加的结果链表。 使用链表来实现多项式相加的好处是,可以灵活地添加、删除和修改多项式的节点,同时节省存储空间。此外,链表的插入和删除操作的时间复杂度为O(1),相比于数组,更加高效。 综上所述,使用链表可以方便地实现多项式相加,提高程序的效率和灵活性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值