C++ Program For Adding Two Polynomials Using Linked List - GeeksforGeeks

06 Jan, 2022
Given two polynomial numbers represented by a linked list. Write a function that add these lists means add the coefficients who have same variable powers.Example:  
Input:
     1st number = 5x2 + 4x1 + 2x0
     2nd number = -5x1 - 5x0
Output:
        5x2-1x1-3x0
Input:
     1st number = 5x3 + 4x2 + 2x0
     2nd number = 5x^1 - 5x^0
Output:
        5x3 + 4x2 + 5x1 - 3x0
CPP
// C++ program for addition of two // polynomials using Linked Lists#include <bits/stdc++.h>using namespace std;  // Node structure containing power // and coefficient of variablestruct Node {    int coeff;    int pow;    struct Node* next;};  // Function to create new nodevoid 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;    }}  // Function Adding two polynomial // numbersvoid polyadd(struct Node* poly1,              struct Node* poly2,             struct Node* poly){    while (poly1->next &&            poly2->next)     {        // If power of 1st polynomial is greater         // than 2nd, then store 1st as it is and         // move its pointer        if (poly1->pow > poly2->pow)         {            poly->pow = poly1->pow;            poly->coeff = poly1->coeff;            poly1 = poly1->next;        }          // If power of 2nd polynomial is greater         // than 1st, then store 2nd as it is and         // move its pointer        else if (poly1->pow < poly2->pow)         {            poly->pow = poly2->pow;            poly->coeff = poly2->coeff;            poly2 = poly2->next;        }          // If power of both polynomial numbers         // is same then add their coefficients        else         {            poly->pow = poly1->pow;            poly->coeff = (poly1->coeff +                            poly2->coeff);            poly1 = poly1->next;            poly2 = poly2->next;        }          // Dynamically create new node        poly->next =               (struct Node*)malloc(sizeof(struct Node));        poly = poly->next;        poly->next = NULL;    }    while (poly1->next || poly2->next)     {        if (poly1->next)         {            poly->pow = poly1->pow;            poly->coeff = poly1->coeff;            poly1 = poly1->next;        }        if (poly2->next)         {            poly->pow = poly2->pow;            poly->coeff = poly2->coeff;            poly2 = poly2->next;        }        poly->next =               (struct Node*)malloc(sizeof(struct Node));        poly = poly->next;        poly->next = NULL;    }}  // Display Linked listvoid show(struct Node* node){    while (node->next != NULL)     {        printf("%dx^%d", node->coeff,                 node->pow);        node = node->next;        if (node->coeff >= 0)         {            if (node->next != NULL)                printf("+");        }    }}  // Driver codeint 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("2nd Number: ");    show(poly2);      poly = (struct Node*)malloc(sizeof(struct Node));      // Function add two polynomial     // numbers    polyadd(poly1, poly2, poly);      // Display resultant List    printf("Added polynomial: ");    show(poly);      return 0;}
Output:
1st Number: 5x^2+4x^1+2x^0
2nd Number: -5x^1-5x^0
Added polynomial: 5x^2-1x^1-3x^0
Time Complexity: O(m + n) where m and n are number of nodes in first and second lists respectively. 
Recursive Method :
Algorithm:
If both the numbers are null then returnelse if compare the power, if same then add the coefficients and recursively call addPolynomials on the next elements of both the numbers.else if the power of the first number is greater then print the current element of the first number and recursively call addPolynomial on the next element of the first number and current element of the second number.else print the current element of the second number and recursively call addPolynomial on the current element of first number and next element of second number.
If both the numbers are null then return
else if compare the power, if same then add the coefficients and recursively call addPolynomials on the next elements of both the numbers.
else if the power of the first number is greater then print the current element of the first number and recursively call addPolynomial on the next element of the first number and current element of the second number.
else print the current element of the second number and recursively call addPolynomial on the current element of first number and next element of second number.
C++
//Program to add two polynomials represented in linkedlist using recursion#include<iostream>using namespace std;class Node{public:  int coeff,power;  Node *next;  Node(int coeff, int power)  {    this->coeff = coeff;    this->power = power;    this->next = NULL;  }};  void addPolynomials(Node *head1,                     Node *head2){  if(head1==NULL &&      head2==NULL)    return;  else if(head1->power ==           head2->power)  {    cout << " " << head1->coeff +  head2->coeff <<             "x^" << head1->power << " ";    addPolynomials(head1->next,head2->next);  }  else if(head1->power > head2->power)  {    cout << " " << head1->coeff <<             "x^" << head1->power << " ";    addPolynomials(head1->next, head2);  }  else  {    cout << " " << head2->coeff <<             "x^" << head2->power << " ";    addPolynomials(head1, head2->next);  }}  void insert(Node *head,             int coeff,             int power){  Node *new_node =         new Node(coeff,power);  while(head->next != NULL)  {    head = head->next;  }  head->next = new_node;}  void printList(Node *head){  cout << "Linked List" << endl;  while(head != NULL)  {    cout << " " << head->coeff <<             "x" << "^" << head->power;    head = head->next;  }}  // Driver codeint main(){  Node *head=new Node(5, 2);  insert(head, 4, 1);  Node *head2 = new Node(6, 2);  insert(head2, 4, 1);  printList(head);  cout << endl;  printList(head2);  cout << endl <<           "Addition:" << endl;  addPolynomials(head,head2);      return 0;}//This code is contributed by Akshita Patel
Output:
Linked List
 5x^2 4x^1
Linked List
 6x^2 4x^1
Addition:
 11x^2  8x^1 
Time Complexity: O(m + n) where m and n are number of nodes in first and second lists respectively.
Please refer complete article on Adding two polynomials using Linked List for more details!
Amazon
Linked-List-Polynomial
maths-polynomial
C++ Programs
Linked List
Mathematical
Amazon
Linked List
Mathematical
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Comments
Old Comments
Passing a function as a parameter in C++
Const keyword in C++
Program to implement Singly Linked List in C++ using class
cout in C++
Dynamic _Cast in C++
Linked List | Set 1 (Introduction)
Linked List | Set 2 (Inserting a node)
Reverse a linked list
Stack Data Structure (Introduction and Program)
Linked List | Set 3 (Deleting a node)