Multiplication of two polynomials using Linked list

13 Sep, 2021
Given two polynomials in the form of linked list. The task is to find the multiplication of both polynomials.
Examples: 
Input: Poly1: 3x^2 + 5x^1 + 6, Poly2: 6x^1 + 8
Output: 18x^3 + 54x^2 + 76x^1 + 48
On multiplying each element of 1st polynomial with 
elements of 2nd polynomial, we get
18x^3 + 24x^2 + 30x^2 + 40x^1 + 36x^1 + 48
On adding values with same power of x,
18x^3 + 54x^2 + 76x^1 + 48

Input: Poly1: 3x^3 + 6x^1 - 9, Poly2: 9x^3 - 8x^2 + 7x^1 + 2
Output: 27x^6 - 24x^5 + 75x^4 - 123x^3 + 114x^2 - 51x^1 - 18
Approach: 
In this approach we will multiply the 2nd polynomial with each term of 1st polynomial.Store the multiplied value in a new linked list.Then we will add the coefficients of elements having the same power in resultant polynomial.
In this approach we will multiply the 2nd polynomial with each term of 1st polynomial.
Store the multiplied value in a new linked list.
Then we will add the coefficients of elements having the same power in resultant polynomial.
Below is the implementation of the above approach: 
C++
Java
Python3
C#
Javascript
// C++ implementation of the above approach#include <bits/stdc++.h>using namespace std; // Node structure containing powerer// and coefficient of variablestruct Node {    int coeff, power;    Node* next;}; // Function add a new node at the end of listNode* addnode(Node* start, int coeff, int power){    // Create a new node    Node* newnode = new Node;    newnode->coeff = coeff;    newnode->power = power;    newnode->next = NULL;     // If linked list is empty    if (start == NULL)        return newnode;     // If linked list has nodes    Node* ptr = start;    while (ptr->next != NULL)        ptr = ptr->next;    ptr->next = newnode;     return start;} // Function To Display The Linked listvoid printList(struct Node* ptr){    while (ptr->next != NULL) {        cout << ptr->coeff << "x^" << ptr->power ;       if( ptr->next!=NULL && ptr->next->coeff >=0)          cout << "+";         ptr = ptr->next;    }    cout << ptr->coeff << "\n";} // Function to add coefficients of// two elements having same powerervoid removeDuplicates(Node* start){    Node *ptr1, *ptr2, *dup;    ptr1 = start;     /* Pick elements one by one */    while (ptr1 != NULL && ptr1->next != NULL) {        ptr2 = ptr1;         // Compare the picked element        // with rest of the elements        while (ptr2->next != NULL) {             // If powerer of two elements are same            if (ptr1->power == ptr2->next->power) {                 // Add their coefficients and put it in 1st element                ptr1->coeff = ptr1->coeff + ptr2->next->coeff;                dup = ptr2->next;                ptr2->next = ptr2->next->next;                 // remove the 2nd element                delete (dup);            }            else                ptr2 = ptr2->next;        }        ptr1 = ptr1->next;    }} // Function two Multiply two polynomial NumbersNode* multiply(Node* poly1, Node* poly2,               Node* poly3){     // Create two pointer and store the    // address of 1st and 2nd polynomials    Node *ptr1, *ptr2;    ptr1 = poly1;    ptr2 = poly2;    while (ptr1 != NULL) {        while (ptr2 != NULL) {            int coeff, power;             // Multiply the coefficient of both            // polynomials and store it in coeff            coeff = ptr1->coeff * ptr2->coeff;             // Add the powerer of both polynomials            // and store it in power            power = ptr1->power + ptr2->power;             // Invoke addnode function to create            // a newnode by passing three parameters            poly3 = addnode(poly3, coeff, power);             // move the pointer of 2nd polynomial            // two get its next term            ptr2 = ptr2->next;        }         // Move the 2nd pointer to the        // starting point of 2nd polynomial        ptr2 = poly2;         // move the pointer of 1st polynomial        ptr1 = ptr1->next;    }     // this function will be invoke to add    // the coefficient of the elements    // having same powerer from the resultant linked list    removeDuplicates(poly3);    return poly3;} // Driver Codeint main(){     Node *poly1 = NULL, *poly2 = NULL, *poly3 = NULL;     // Creation of 1st Polynomial: 3x^2 + 5x^1 + 6    poly1 = addnode(poly1, 3, 3);    poly1 = addnode(poly1, 6, 1);    poly1 = addnode(poly1, -9, 0);     // Creation of 2nd polynomial: 6x^1 + 8    poly2 = addnode(poly2, 9, 3);    poly2 = addnode(poly2, -8, 2);    poly2 = addnode(poly2, 7, 1);    poly2 = addnode(poly2, 2, 0);     // Displaying 1st polynomial    cout << "1st Polynomial:- ";    printList(poly1);     // Displaying 2nd polynomial    cout << "2nd Polynomial:- ";    printList(poly2);     // calling multiply function    poly3 = multiply(poly1, poly2, poly3);     // Displaying Resultant Polynomial    cout << "Resultant Polynomial:- ";    printList(poly3);     return 0;}
// Java implementation of above approachimport java.util.*;class GFG{ // Node structure containing powerer// and coefficient of variablestatic class Node {    int coeff, power;    Node next;}; // Function add a new node at the end of liststatic Node addnode(Node start, int coeff, int power){    // Create a new node    Node newnode = new Node();    newnode.coeff = coeff;    newnode.power = power;    newnode.next = null;     // If linked list is empty    if (start == null)        return newnode;     // If linked list has nodes    Node ptr = start;    while (ptr.next != null)        ptr = ptr.next;    ptr.next = newnode;     return start;} // Function To Display The Linked liststatic void printList( Node ptr){    while (ptr.next != null) {        System.out.print( ptr.coeff + "x^" + ptr.power + " + ");         ptr = ptr.next;    }    System.out.print( ptr.coeff  +"\n");} // Function to add coefficients of// two elements having same powererstatic void removeDuplicates(Node start){    Node ptr1, ptr2, dup;    ptr1 = start;     /* Pick elements one by one */    while (ptr1 != null && ptr1.next != null) {        ptr2 = ptr1;         // Compare the picked element        // with rest of the elements        while (ptr2.next != null) {             // If powerer of two elements are same            if (ptr1.power == ptr2.next.power) {                 // Add their coefficients and put it in 1st element                ptr1.coeff = ptr1.coeff + ptr2.next.coeff;                dup = ptr2.next;                ptr2.next = ptr2.next.next;             }            else                ptr2 = ptr2.next;        }        ptr1 = ptr1.next;    }} // Function two Multiply two polynomial Numbersstatic Node multiply(Node poly1, Node poly2,            Node poly3){     // Create two pointer and store the    // address of 1st and 2nd polynomials    Node ptr1, ptr2;    ptr1 = poly1;    ptr2 = poly2;    while (ptr1 != null) {        while (ptr2 != null) {            int coeff, power;             // Multiply the coefficient of both            // polynomials and store it in coeff            coeff = ptr1.coeff * ptr2.coeff;             // Add the powerer of both polynomials            // and store it in power            power = ptr1.power + ptr2.power;             // Invoke addnode function to create            // a newnode by passing three parameters            poly3 = addnode(poly3, coeff, power);             // move the pointer of 2nd polynomial            // two get its next term            ptr2 = ptr2.next;        }         // Move the 2nd pointer to the        // starting point of 2nd polynomial        ptr2 = poly2;         // move the pointer of 1st polynomial        ptr1 = ptr1.next;    }     // this function will be invoke to add    // the coefficient of the elements    // having same powerer from the resultant linked list    removeDuplicates(poly3);    return poly3;} // Driver Codepublic static void main(String args[]){     Node poly1 = null, poly2 = null, poly3 = null;     // Creation of 1st Polynomial: 3x^2 + 5x^1 + 6    poly1 = addnode(poly1, 3, 2);    poly1 = addnode(poly1, 5, 1);    poly1 = addnode(poly1, 6, 0);     // Creation of 2nd polynomial: 6x^1 + 8    poly2 = addnode(poly2, 6, 1);    poly2 = addnode(poly2, 8, 0);     // Displaying 1st polynomial    System.out.print("1st Polynomial:- ");    printList(poly1);     // Displaying 2nd polynomial    System.out.print("2nd Polynomial:- ");    printList(poly2);     // calling multiply function    poly3 = multiply(poly1, poly2, poly3);     // Displaying Resultant Polynomial    System.out.print( "Resultant Polynomial:- ");    printList(poly3); }  }// This code is contributed by Arnab Kundu
# Python3 implementation of the above approach  # Node structure containing powerer# and coefficient of variableclass Node:      def __init__(self):              self.coeff = None        self.power = None        self.next = None  # Function add a new node at the end of listdef addnode(start, coeff, power):     # Create a new node    newnode = Node();    newnode.coeff = coeff;    newnode.power = power;    newnode.next = None;      # If linked list is empty    if (start == None):        return newnode;      # If linked list has nodes    ptr = start;    while (ptr.next != None):        ptr = ptr.next;    ptr.next = newnode;    return start;  # Function To Display The Linked listdef printList(ptr):     while (ptr.next != None):        print(str(ptr.coeff) + 'x^' + str(ptr.power), end = '')        if( ptr.next != None and ptr.next.coeff >= 0):            print('+', end = '')        ptr = ptr.next    print(ptr.coeff)      # Function to add coefficients of# two elements having same powererdef removeDuplicates(start):    ptr2 = None    dup = None    ptr1 = start;      # Pick elements one by one    while (ptr1 != None and ptr1.next != None):        ptr2 = ptr1;          # Compare the picked element        # with rest of the elements        while (ptr2.next != None):              # If powerer of two elements are same            if (ptr1.power == ptr2.next.power):                  # Add their coefficients and put it in 1st element                ptr1.coeff = ptr1.coeff + ptr2.next.coeff;                dup = ptr2.next;                ptr2.next = ptr2.next.next;                         else:                ptr2 = ptr2.next;                 ptr1 = ptr1.next;     # Function two Multiply two polynomial Numbersdef multiply(poly1, Npoly2, poly3):      # Create two pointer and store the    # address of 1st and 2nd polynomials    ptr1 = poly1;    ptr2 = poly2;         while (ptr1 != None):        while (ptr2 != None):              # Multiply the coefficient of both            # polynomials and store it in coeff            coeff = ptr1.coeff * ptr2.coeff;              # Add the powerer of both polynomials            # and store it in power            power = ptr1.power + ptr2.power;              # Invoke addnode function to create            # a newnode by passing three parameters            poly3 = addnode(poly3, coeff, power);              # move the pointer of 2nd polynomial            # two get its next term            ptr2 = ptr2.next;                  # Move the 2nd pointer to the        # starting point of 2nd polynomial        ptr2 = poly2;          # move the pointer of 1st polynomial        ptr1 = ptr1.next;          # this function will be invoke to add    # the coefficient of the elements    # having same powerer from the resultant linked list    removeDuplicates(poly3);    return poly3;  # Driver Codeif __name__=='__main__':    poly1 = None    poly2 = None    poly3 = None;      # Creation of 1st Polynomial: 3x^2 + 5x^1 + 6    poly1 = addnode(poly1, 3, 3);    poly1 = addnode(poly1, 6, 1);    poly1 = addnode(poly1, -9, 0);      # Creation of 2nd polynomial: 6x^1 + 8    poly2 = addnode(poly2, 9, 3);    poly2 = addnode(poly2, -8, 2);    poly2 = addnode(poly2, 7, 1);    poly2 = addnode(poly2, 2, 0);      # Displaying 1st polynomial    print("1st Polynomial:- ", end = '');    printList(poly1);      # Displaying 2nd polynomial    print("2nd Polynomial:- ", end = '');    printList(poly2);      # calling multiply function    poly3 = multiply(poly1, poly2, poly3);      # Displaying Resultant Polynomial    print("Resultant Polynomial:- ", end = '');    printList(poly3);  # This code is contributed by rutvik_56
// C# implementation of above approachusing System; class GFG{ // Node structure containing powerer// and coefficient of variablepublic class Node{    public int coeff, power;    public Node next;}; // Function add a new node at the end of liststatic Node addnode(Node start, int coeff, int power){    // Create a new node    Node newnode = new Node();    newnode.coeff = coeff;    newnode.power = power;    newnode.next = null;     // If linked list is empty    if (start == null)        return newnode;     // If linked list has nodes    Node ptr = start;    while (ptr.next != null)        ptr = ptr.next;    ptr.next = newnode;     return start;} // Function To Display The Linked liststatic void printList( Node ptr){    while (ptr.next != null)    {        Console.Write( ptr.coeff + "x^" + ptr.power + " + ");         ptr = ptr.next;    }    Console.Write( ptr.coeff +"\n");} // Function to add coefficients of// two elements having same powererstatic void removeDuplicates(Node start){    Node ptr1, ptr2, dup;    ptr1 = start;     /* Pick elements one by one */    while (ptr1 != null && ptr1.next != null)    {        ptr2 = ptr1;         // Compare the picked element        // with rest of the elements        while (ptr2.next != null)        {             // If powerer of two elements are same            if (ptr1.power == ptr2.next.power)            {                 // Add their coefficients and put it in 1st element                ptr1.coeff = ptr1.coeff + ptr2.next.coeff;                dup = ptr2.next;                ptr2.next = ptr2.next.next;             }            else                ptr2 = ptr2.next;        }        ptr1 = ptr1.next;    }} // Function two Multiply two polynomial Numbersstatic Node multiply(Node poly1, Node poly2,            Node poly3){     // Create two pointer and store the    // address of 1st and 2nd polynomials    Node ptr1, ptr2;    ptr1 = poly1;    ptr2 = poly2;    while (ptr1 != null)    {        while (ptr2 != null)        {            int coeff, power;             // Multiply the coefficient of both            // polynomials and store it in coeff            coeff = ptr1.coeff * ptr2.coeff;             // Add the powerer of both polynomials            // and store it in power            power = ptr1.power + ptr2.power;             // Invoke addnode function to create            // a newnode by passing three parameters            poly3 = addnode(poly3, coeff, power);             // move the pointer of 2nd polynomial            // two get its next term            ptr2 = ptr2.next;        }         // Move the 2nd pointer to the        // starting point of 2nd polynomial        ptr2 = poly2;         // move the pointer of 1st polynomial        ptr1 = ptr1.next;    }     // this function will be invoke to add    // the coefficient of the elements    // having same powerer from the resultant linked list    removeDuplicates(poly3);    return poly3;} // Driver Codepublic static void Main(String []args){     Node poly1 = null, poly2 = null, poly3 = null;     // Creation of 1st Polynomial: 3x^2 + 5x^1 + 6    poly1 = addnode(poly1, 3, 2);    poly1 = addnode(poly1, 5, 1);    poly1 = addnode(poly1, 6, 0);     // Creation of 2nd polynomial: 6x^1 + 8    poly2 = addnode(poly2, 6, 1);    poly2 = addnode(poly2, 8, 0);     // Displaying 1st polynomial    Console.Write("1st Polynomial:- ");    printList(poly1);     // Displaying 2nd polynomial    Console.Write("2nd Polynomial:- ");    printList(poly2);     // calling multiply function    poly3 = multiply(poly1, poly2, poly3);     // Displaying Resultant Polynomial    Console.Write( "Resultant Polynomial:- ");    printList(poly3);}} // This code has been contributed by 29AjayKumar
<script> // Javascript implementation of above approach // Link list nodeclass Node {        constructor() {                this.coeff = 0;                this.power = 0;                this.next = null;             }        }         // Function add a new node at the end of listfunction addnode(start, coeff, power){    // Create a new node    var newnode = new Node();    newnode.coeff = coeff;    newnode.power = power;    newnode.next = null;     // If linked list is empty    if (start == null)        return newnode;     // If linked list has nodes    var ptr = start;    while (ptr.next != null)        ptr = ptr.next;    ptr.next = newnode;     return start;} // Function To Display The Linked listfunction printList( ptr){    while (ptr.next != null) {        document.write( ptr.coeff + "x^" + ptr.power + " + ");         ptr = ptr.next;    }    document.write( ptr.coeff +"</br>");} // Function to add coefficients of// two elements having same powererfunction removeDuplicates( start){    var ptr1, ptr2, dup;    ptr1 = start;     /* Pick elements one by one */    while (ptr1 != null && ptr1.next != null) {        ptr2 = ptr1;         // Compare the picked element        // with rest of the elements        while (ptr2.next != null) {             // If powerer of two elements are same            if (ptr1.power == ptr2.next.power) {                 // Add their coefficients and put it in 1st element                ptr1.coeff = ptr1.coeff + ptr2.next.coeff;                dup = ptr2.next;                ptr2.next = ptr2.next.next;             }            else                ptr2 = ptr2.next;        }        ptr1 = ptr1.next;    }} // Function two Multiply two polynomial Numbersfunction multiply( poly1,  poly2,             poly3){     // Create two pointer and store the    // address of 1st and 2nd polynomials    var ptr1, ptr2;    ptr1 = poly1;    ptr2 = poly2;    while (ptr1 != null) {        while (ptr2 != null) {            let coeff, power;             // Multiply the coefficient of both            // polynomials and store it in coeff            coeff = ptr1.coeff * ptr2.coeff;             // Add the powerer of both polynomials            // and store it in power            power = ptr1.power + ptr2.power;             // Invoke addnode function to create            // a newnode by passing three parameters            poly3 = addnode(poly3, coeff, power);             // move the pointer of 2nd polynomial            // two get its next term            ptr2 = ptr2.next;        }         // Move the 2nd pointer to the        // starting point of 2nd polynomial        ptr2 = poly2;         // move the pointer of 1st polynomial        ptr1 = ptr1.next;    }     // this function will be invoke to add    // the coefficient of the elements    // having same powerer from the resultant linked list    removeDuplicates(poly3);    return poly3;} // Driver Code var poly1 = null, poly2 = null, poly3 = null; // Creation of 1st Polynomial: 3x^2 + 5x^1 + 6poly1 = addnode(poly1, 3, 2);poly1 = addnode(poly1, 5, 1);poly1 = addnode(poly1, 6, 0); // Creation of 2nd polynomial: 6x^1 + 8poly2 = addnode(poly2, 6, 1);poly2 = addnode(poly2, 8, 0); // Displaying 1st polynomialdocument.write("1st Polynomial:- ");printList(poly1); // Displaying 2nd polynomialdocument.write("2nd Polynomial:- ");printList(poly2); // calling multiply functionpoly3 = multiply(poly1, poly2, poly3); // Displaying Resultant Polynomialdocument.write( "Resultant Polynomial:- ");printList(poly3); // This code is contributed by jana_sayantan.   </script>
1st Polynomial:- 3x^3+6x^1-9
2nd Polynomial:- 9x^3-8x^2+7x^1+2
Resultant Polynomial:- 27x^6-24x^5+75x^4-123x^3+114x^2-51x^1-18
andrew1234
29AjayKumar
aniket173000
rutvik_56
jana_sayantan
surindertarika1234
Linked-List-Polynomial
maths-polynomial
Technical Scripter 2018
Linked List
Technical Scripter
Linked List
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
LinkedList in Java
Introduction to Data Structures
Doubly Linked List | Set 1 (Introduction and Insertion)
Detect loop in a linked list
Merge two sorted linked lists
What is Data Structure: Types, Classifications and Applications
Find the middle of a given linked list
Linked List vs Array
Merge Sort for Linked Lists
Implementing a Linked List in Java using Class