链表实现多项式加法的核心是系数与指数协同比较和合并,节点须同时含coef和exp字段;输入时需保证指数降序有序;双指针合并需覆盖三种指数关系并丢弃系数和为0的项;收尾时直接拼接剩余链表。

链表实现多项式加法,核心不在“存”,而在“比”和“合”——系数与指数必须协同判断,不能只看一个。
节点结构要带齐两个关键字段
每个节点必须同时保存系数(coef)和指数(exp),缺一不可。仅存系数无法定位项的位置,仅存指数无法参与运算。常见错误是把指数当数组下标用,但链表不靠位置索引,而靠显式比较。
结构体示例:
typedef struct PolyNode {float coef;
int exp;
struct PolyNode *next;
} PolyNode, *Polynomial;
输入阶段就要保证链表有序
多项式链表必须按指数降序或升序排列(推荐降序,如 5x⁴ + 2x² + x),否则后续双指针合并逻辑会失效。有两种可靠做法:
- 输入时逐个插入:每次新节点都找到合适位置插入(类似有序链表插入),保持全程有序
- 输入后统一排序:先无序建链,再调用归并排序或插入排序,按 exp 字段重排
不建议边输边排序再反转——易出错且冗余。头结点可设为哑节点(dummy head),简化边界处理。
双指针合并时的三种分支必须闭环
设 p1、p2 分别指向两多项式当前待处理节点,r 指向结果链表尾部。每轮只推进一个指针,逻辑必须覆盖全部情况:
- p1->exp > p2->exp:p1 项更高次,直接摘下接入结果,p1 后移
- p1->exp exp:p2 项更高次,直接摘下接入结果,p2 后移
- p1->exp == p2->exp:系数相加;若和为 0,跳过不存;否则存入新节点,p1 与 p2 同时后移
特别注意:系数相加后为 0 必须丢弃该节点,否则输出会出现 “0x⁵” 这类无效项。
收尾处理不能遗漏剩余项
当任一链表遍历完毕,另一链表可能还有剩余节点。此时不能终止,需将剩余整段链表直接链接到结果链表末尾——不是逐个复制,而是指针拼接,效率更高。
例如 p1 为空但 p2 非空,则执行:
r->next = p2;
随后 r 移至末尾即可,无需循环。

















