【练习3.6】
编写将两个多项式相加的函数。不要毁坏输入数据。用一个链表实现。
如果这两个多项式分别有M项和N项,那么你程序的时间复杂度是多少?
两个按幂次升序的多项式链表,分别维护一个指针。
幂较小者将元素的副本拷贝入节点并加入新链表,指针向后移动。
幂同样大时,将两者的系数相加后的结果加入新链表,两个多项式链表的指针共同向前移动。
其中一个多项式到达尾部时,如另一个未到达尾部,则一边后移一边将相同元素的新节点加入新链表。
时间复杂度O(M+N)。
测试代码如下:
1 #include <iostream> 2 #include "linklist.h" 3 using linklist::List; 4 using namespace std; 5 int main(void) 6 { 7 //测试多项式加法 8 List<Poly> a; 9 a.additem(Poly(3, 1)); 10 a.additem(Poly(1, 2)); 11 a.additem(Poly(4, 3)); 12 a.additem(Poly(7, 4)); 13 a.additem(Poly(2, 5)); 14 cout << " ( " << flush; 15 a.traverse(); 16 cout << ") +\n" << flush; 17 List<Poly> b; 18 b.additem(Poly(5, 2)); 19 b.additem(Poly(2, 3)); 20 b.additem(Poly(1, 5)); 21 b.additem(Poly(3, 7)); 22 b.additem(Poly(1, 11)); 23 cout << " ( " << flush; 24 b.traverse(); 25 cout << ") =\n" << flush; 26 27 List<Poly> answer = linklist::polyplus(a, b); 28 cout << "\n ( " << flush; 29 answer.traverse(); 30 cout << ") \n" << flush; 31 system("pause"); 32 }