Adding two polynomials using Linked List using map
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
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 <bits/stdc++.h> 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.