每天学一点------多项式相加
多项式相加是通过遍历比较两多项式同次项系数并合并,不同次项直接保留,最终得到新多项式的经典数据结构问题,常采用链表或数组表示多项式并实现相应算法。
核心思路
-
链表结构:每个节点存储
(系数, 指数)
,按指数降序排列。 -
相加逻辑:遍历两个链表,比较当前项的指数:
-
指数大的项直接加入结果。
-
指数相同则合并系数(系数为 0 则跳过)。
-
实例:
现有两个多项式:
A(x)=8+12x+7x^4+5x^15
B(x)=4+30x^2+6x^7+8x^17
1.创建结构体
注意:包括(系数,x的指数,指向下一节点)。同时创建多项式链表时需保持指数有序排列。
方法一:输入多项式时可先按任意顺序输入节点,之后进行排序;
方法二:直接在插入时维护有序性。例如通过尾插法建立链表后,调用排序算法:
typedef struct PolyNode {
float coef; // 系数
int exp; // 指数
struct PolyNode *next;
} PolyNode, *Polynomial;
2.创建链表
如图创建两条链表:
3.核心逻辑
同步遍历两个多项式链表时,双指针的核心逻辑是通过比较节点的指数大小来决定合并策略。以下是详细步骤:
1.初始化两个指针p1
和p2
,分别指向两个多项式链表的头节点。
2.比较p1
和p2
当前节点的指数(核心操作):
- 若
p1->exp 大于 p2->exp
,将p1
的节点加入结果链表,p1
向后移动。 - 若
p1->exp 小于 p2->exp
,将p2
的节点加入结果链表,p2
向后移动。 - 若
p1->exp 等于 p2->exp
,将两节点的系数相加,若结果不为零则加入结果链表,同时p1
和p2
均向后移动。
3.遍历结束后,检查是否有剩余的未处理节点:
- 若
p1
不为空,将p1
剩余节点加入结果链表。 - 若
p2
不为空,将p2
剩余节点加入结果链表。
代码实现示例(C语言)
struct Node {
float coeff;
int exp;
struct Node* next;
};
struct Node* addPolynomials(struct Node* poly1, struct Node* poly2) {
struct Node dummy;
struct Node* tail = &dummy;
dummy.next = NULL;
while (poly1 && poly2) {
if (poly1->exp > poly2->exp) {
tail->next = poly1;
poly1 = poly1->next;
} else if (poly1->exp < poly2->exp) {
tail->next = poly2;
poly2 = poly2->next;
} else {
float sum = poly1->coeff + poly2->coeff;
if (sum != 0) {
poly1->coeff = sum;
tail->next = poly1;
}
poly1 = poly1->next;
poly2 = poly2->next;
}
tail = tail->next;
}
tail->next = (poly1 != NULL) ? poly1 : poly2;
return dummy.next;
}
(额外知识点)稀疏多项式:是指在一元多项式中,系数为0的项数目远远多于非0项的数目
我也是在学习中分享知识点,若有错误,请各位私信我指出,共同学习和进步。
以下是专业老师讲解,若未看懂,请再看老师的详细解说: