Related Articles
• Last Updated : 30 Jul, 2019

Given two polynomial numbers represented by a linked list. Write a function to perform their algebraic sum.

Examples:

Input:
1st number = 5x^2 + 4x^1 + 2x^0
2nd number = 5x^1 + 5x^0
Output: 5x^2 + 9x^1 + 7x^0

## Recommended: Please try your approach on {IDE} first, before moving on to the solution.

Approach: The implementation uses map data structure so that all coefficients of same power value are added together and kept in key-value pairs inside a map.

Below is the implementation of the above approach:

 `// C++ program for addition of two polynomials``// represented as linked lists``#include ``using` `namespace` `std;`` ` `// Structure of Node used``struct` `Node {`` ` `    ``// Coefficient of the polynomial``    ``int` `coeff;`` ` `    ``// Power of the polynomial``    ``int` `pow``;``    ``Node* next;``};`` ` `// Function to create new node``void` `create_node(``int` `x, ``int` `y,``                 ``struct` `Node** temp)``{``    ``struct` `Node *r, *z;``    ``z = *temp;``    ``if` `(z == NULL) {``        ``r = (``struct` `Node*)``            ``malloc``(``sizeof``(``struct` `Node));``        ``r->coeff = x;``        ``r->``pow` `= y;``        ``*temp = r;``        ``r->next = (``struct` `Node*)``            ``malloc``(``sizeof``(``struct` `Node));``        ``r = r->next;``        ``r->next = NULL;``    ``}``    ``else` `{``        ``r->coeff = x;``        ``r->``pow` `= y;``        ``r->next = (``struct` `Node*)``            ``malloc``(``sizeof``(``struct` `Node));``        ``r = r->next;``        ``r->next = NULL;``    ``}``}`` ` `// Display Linked list``void` `show(``struct` `Node* node)``{``    ``if` `(node == NULL)``        ``return``;``    ``while` `(node->next != NULL) {``        ``printf``(``"%dx^%d"``, node->coeff, node->``pow``);``        ``node = node->next;``        ``if` `(node->next != NULL)``            ``printf``(``" + "``);``    ``}``}`` ` `/* Function to print the required sum of a ``polynomial p1 and p2 as specified in output */``void` `addPolynomial(Node* p1, Node* p2)``{``    ``map<``int``, ``int``> mp;``    ``Node* temp1 = p1;``    ``Node* temp2 = p2;``    ``while` `(temp1 != NULL) {`` ` `        ``// Add coefficients of same power value``        ``// map contains (powervalue, coeff) pair``        ``mp[temp1->``pow``] += temp1->coeff;``        ``temp1 = temp1->next;``    ``}``    ``while` `(temp2 != NULL) {``        ``mp[temp2->``pow``] += temp2->coeff;``        ``temp2 = temp2->next;``    ``}`` ` `    ``// Started from the end because higher power should``    ``// come first and there should be "+" symbol in between``    ``// so iterate up to second element and print last out of``    ``// the loop.`` ` `    ``for` `(``auto` `it = (mp.rbegin()); it != prev(mp.rend()); ++it)``        ``cout << it->second << ``"x^"` `<< it->first << ``" + "``;``    ``cout << mp.begin()->second << ``"x^"` `<< mp.begin()->first;``}`` ` `// Driver function``int` `main()``{``    ``struct` `Node *poly1 = NULL, *poly2 = NULL, *poly = NULL;`` ` `    ``// Create first list of 5x^2 + 4x^1 + 2x^0``    ``create_node(5, 2, &poly1);``    ``create_node(4, 1, &poly1);``    ``create_node(2, 0, &poly1);`` ` `    ``// Create second list of 5x^1 + 5x^0``    ``create_node(5, 1, &poly2);``    ``create_node(5, 0, &poly2);`` ` `    ``printf``(``"1st Number: "``);``    ``show(poly1);`` ` `    ``printf``(``"\n2nd Number: "``);``    ``show(poly2);`` ` `    ``poly = (``struct` `Node*)``malloc``(``sizeof``(``struct` `Node));`` ` `    ``printf``(``"\nAdded polynomial: "``);`` ` `    ``// Function add two polynomial numbers``    ``addPolynomial(poly1, poly2);`` ` `    ``return` `0;``}`
Output:
```1st Number: 5x^2 + 4x^1 + 2x^0
2nd Number: 5x^1 + 5x^0
Added polynomial: 5x^2 + 9x^1 + 7x^0
```

Time Complexity: O((m + n)log(m+n)) where m and n are numbers of nodes in first and second lists respectively and we are using a map for adding the coefficients extra log(m+n) factor is added.

My Personal Notes arrow_drop_up