Multiplication of two polynomials using Linked list

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 + 135x^3 + 114x^2 + 75x^1 + 18

Approach:

  1. In this approach we will multiply the 2nd polynomial with each term of 1st polynomial.
  2. Store the multiplied value in a new linked list.
  3. Then we will add the coefficients of elements having the same power in resultant polynomial.

Below is the implementation of the above approach:

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ implementation of the above approach
#include <bits/stdc++.h>
using namespace std;
  
// Node structure containing powerer
// and coefficient of variable
struct Node {
    int coeff, power;
    Node* next;
};
  
// Function add a new node at the end of list
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;
}
  
// Functionn To Display The Linked list
void printList(struct Node* ptr)
{
    while (ptr->next != NULL) {
        cout << ptr->coeff << "x^" << ptr->power << " + ";
  
        ptr = ptr->next;
    }
    cout << ptr->coeff << "\n";
}
  
// Function to add coefficients of
// two elements having same powerer
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;
  
                // remove the 2nd element
                delete (dup);
            }
            else
                ptr2 = ptr2->next;
        }
        ptr1 = ptr1->next;
    }
}
  
// Function two Multiply two polynomial Numbers
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 Code
int main()
{
  
    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
    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;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java implementation of above approach 
import java.util.*;
class GFG
{
  
// Node structure containing powerer 
// and coefficient of variable 
static class Node { 
    int coeff, power; 
    Node next; 
}; 
  
// Function add a new node at the end of list 
static 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; 
  
// Functionn To Display The Linked list 
static 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 powerer 
static 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 Numbers 
static 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 Code 
public 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

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# implementation of above approach 
using System;
  
class GFG
{
  
// Node structure containing powerer 
// and coefficient of variable 
public class Node 
    public int coeff, power; 
    public Node next; 
}; 
  
// Function add a new node at the end of list 
static 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; 
  
// Functionn To Display The Linked list 
static 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 powerer 
static 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 Numbers 
static 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 Code 
public 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

chevron_right


Output:

1st Polynomial:- 3x^2 + 5x^1 + 6
2nd Polynomial:- 6x^1 + 8
Resultant Polynomial:- 18x^3 + 54x^2 + 76x^1 + 48


My Personal Notes arrow_drop_up

PROGRAMMER & WEBDEVELOPER

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.



Improved By : andrew1234, 29AjayKumar