一次多项式相加 java链表,链表实现两个多项式的加法

最近遇到这样一个题目,使用链表来实现两个多项式的加法,刚开始觉得应该比较简单,也可能是自己基础不扎实吧,这其中也是踩了很多的坑啊,最终还是成功了,特此写博客记录一下。

一、题目要求

使用链表来实现两个多项式的加法,输出最终相加后的多项式。多项式默认是按指数(幂次)依次递增的,输入时会依次输入每一项的系数和指数,两个多项式之间的数据以连续两个0来结束一个多项式的输入,最终输出两个多项式相加的多项式结果。例如:

多项式A: X^1 + 2 * X^2 + 3 * X^3

多项式B: X^1 + 2 * X^2 + 3 * X^3

输入:

1 1

2 2

3 3

0 0

1 1

2 2

3 3

0 0

输出:

2 * X^1 + 4 * X^2 + 6 * X^3

上面便是题目的要求,下面我们开始正式分析。

二、题目分析

我们先要解决的问题是多项式的存储问题,即它在计算机中的表现形式,很明显我们只需要存储了多项式的系数和指数即可以开始后面加法计算。这里我们又两种存储方式,一种是线性存储,另一种是链式存储。

线性存储,比如我们采用数组来存储这些数据,理论来说是可以的,但是由于我们的多项式的项数是不确定的,但数组必须在刚开始就必须

先给定一个初始的大小,这个初始大小我们不好确定,分配少了,没法存储全部多项式,分配多了,会造成空间浪费,所以我们在这里采用链表来存储多项式,每次输入一个多项式节点,我们就分配一个链表的节点,这样便可以合理的节约空间。

接着我们分析的是具体的实现步骤,我在这里将其分为三步:

第一步:

接收用户控制台的输入,并且生成对应的两个多项式的链表表示。

我们的每个链表节点有三个域,前两个域是数据域,依次表示多项式的系数和指数,第三个域是指针域,指向下一个节点

这里我们为了方便后续处理,给每个连边增加一个头结点,头结点的数据域内都放-1,没有实际意义。如下图所示:

2c41a2744710

头结点

第二步:

依次对两个链表中的数据进行加法处理

这一步是我们的关键步骤,下面将以图文结合的方式来进行解释:

2c41a2744710

链表加法

如图中所示,我们准备了A、B两个链表

链表A表示的多项式: 7 * X^1 + 2 * X^2 + 8 * X^5

链表B表示的多项式: 2 * X^1 + (-2 * X^2) + 2 * X^3

链表C是我们最终的和链表

这里我们按照这样的步骤进行处理:

1 . 我们规定三个头指针,分别指向三个链表的头,然后再规定三个移动指针,分别指向当前三个链表中正在处理的那个节点

2 . 我们让A、B、C的移动指针刚开始也处于头指针的位置,然后,我们拿A第一个节点中的指数和B第一个节点中的指数进行比较,这个时候有三种情况:

a情况 . A中当前的节点指数 < B中当前的节点指数 ------ 我们将A中的当前节点插入C中,然后向后移动A和C的指针(因为A中当前节点已经处理了)

b情况 . A中当前的节点指数 > B中当前的节点指数 ------ 我们将B中的当前节点插入C中,然后向后移动B和C的指针(因为B中当前节点已经处理了) 即图中⑧的情况。

c情况 . A中当前的节点指数 > B中当前的节点指数 ------ 此时A和B当前节点指数相同,可以进行系数相加,这时候也会出现两种情况:

情况1 . 系数之和不为0 ------ 我们此时将系数之和放到A中的当前节点的系数域,然后将A中的该

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值