📜  使用链表添加两个多项式(1)

📅  最后修改于: 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)$。可以按照以下步骤来实现:

  1. 创建结果多项式 $h(x)$ 的链表,初始为空。

  2. 创建两个指针 $p$ 和 $q$,分别指向 $f(x)$ 和 $g(x)$ 的链表头。

  3. 如果两个指针都不为空,执行以下步骤:

    1. 如果 $p$ 的指数大于 $q$ 的指数,则将 $p$ 的节点加入 $h(x)$ 的链表中,移动 $p$ 指针。
    2. 如果 $p$ 的指数小于 $q$ 的指数,则将 $q$ 的节点加入 $h(x)$ 的链表中,移动 $q$ 指针。
    3. 如果 $p$ 的指数等于 $q$ 的指数,则将 $p$ 和 $q$ 的节点系数相加,然后将节点加入 $h(x)$ 的链表中,同时移动 $p$ 和 $q$ 指针。
  4. 如果 $p$ 的链表还有剩余节点,将其全部加入 $h(x)$ 的链表中。

  5. 如果 $q$ 的链表还有剩余节点,将其全部加入 $h(x)$ 的链表中。

  6. 返回 $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 类来表示链表节点。节点包含两个成员变量 coefexpo,分别表示系数和指数。还定义了一个 next 成员变量,表示下一个节点的指针。

add_poly 函数实现了多项式加法。首先创建了一个 head 节点作为结果链表的头指针,同时创建了一个 tail 节点作为结果链表的尾指针。然后创建两个指针 pq,分别指向两个多项式的头节点。

在循环中,比较 pq 的指数大小,根据大小关系将节点加入结果链表中。如果指数相同,则将系数相加并加入结果链表中。

最后,如果 pq 中一个已经到达链表末尾,将剩余的节点直接加入结果链表中。

运行以下测试代码:

# 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 类来表示多项式节点,并结合该节点的指针来进行操作,实现了多项式加法。