📅  最后修改于: 2023-12-03 15:06:59.644000             🧑  作者: Mango
多项式加法是高中数学中一个经典的问题,也是程序员面试的常见题目。这篇文章将介绍如何使用链表来实现两个多项式的加法。
一个多项式可以用以下形式来表示:
$$ f(x) = a_0 + a_1x + a_2x^2 + ... + a_{n-1}x^{n-1} + a_nx^n $$
其中,$a_0 ... a_n$ 是多项式的系数,$x$ 是未知数,$n$ 是多项式的次数。
我们可以用链表来表示一个多项式。链表的每个节点包含两个值:系数和指数。例如,以下链表表示了一个三次多项式:
3x^3 -> 2x^2 -> -5x^1 -> 1x^0
其中,第一个节点的系数为3,指数为3,表示 $3x^3$ 这一项;第二个节点的系数为2,指数为2,表示 $2x^2$ 这一项;以此类推。链表的最后一个节点通常为常数项,即指数为0的节点。
假设有两个多项式 $f(x)$ 和 $g(x)$,我们的目标是求出 $f(x)+g(x)$。可以按照以下步骤来实现:
创建结果多项式 $h(x)$ 的链表,初始为空。
创建两个指针 $p$ 和 $q$,分别指向 $f(x)$ 和 $g(x)$ 的链表头。
如果两个指针都不为空,执行以下步骤:
如果 $p$ 的链表还有剩余节点,将其全部加入 $h(x)$ 的链表中。
如果 $q$ 的链表还有剩余节点,将其全部加入 $h(x)$ 的链表中。
返回 $h(x)$ 的链表头。
下面是一个 Python 实现的例子:
class Node:
def __init__(self, coef, expo):
self.coef = coef
self.expo = expo
self.next = None
def add_poly(poly1, poly2):
head = Node(0, 0)
tail = head
p = poly1
q = poly2
while p and q:
if p.expo > q.expo:
tail.next = p
p = p.next
elif p.expo < q.expo:
tail.next = q
q = q.next
else:
coef = p.coef + q.coef
if coef != 0:
node = Node(coef, p.expo)
tail.next = node
tail = node
p = p.next
q = q.next
if p:
tail.next = p
if q:
tail.next = q
return head.next
代码解释:
首先定义了一个 Node
类来表示链表节点。节点包含两个成员变量 coef
和 expo
,分别表示系数和指数。还定义了一个 next
成员变量,表示下一个节点的指针。
add_poly
函数实现了多项式加法。首先创建了一个 head
节点作为结果链表的头指针,同时创建了一个 tail
节点作为结果链表的尾指针。然后创建两个指针 p
和 q
,分别指向两个多项式的头节点。
在循环中,比较 p
和 q
的指数大小,根据大小关系将节点加入结果链表中。如果指数相同,则将系数相加并加入结果链表中。
最后,如果 p
或 q
中一个已经到达链表末尾,将剩余的节点直接加入结果链表中。
运行以下测试代码:
# 3x^2 + 2x^1 + 1x^0
poly1 = Node(3, 2)
poly1.next = Node(2, 1)
poly1.next.next = Node(1, 0)
# -1x^1 + 4x^0
poly2 = Node(-1, 1)
poly2.next = Node(4, 0)
# 3x^2 - x^1 + 5x^0
result = add_poly(poly1, poly2)
while result:
print(f"{result.coef}x^{result.expo}", end=" ")
result = result.next
输出结果为:
3x^2 -1x^1 5x^0
表示结果多项式为 $3x^2 - x + 5$。
本文介绍了如何使用链表来实现两个多项式的加法。难点在于处理多个多项式节点的指针移动及系数的加法。通过定义一个 Node
类来表示多项式节点,并结合该节点的指针来进行操作,实现了多项式加法。