GeeksforGeeks App
Open App
Browser
Continue

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

Recommended Practice

Implementation:

## CPP

 // C++ program for addition of two polynomials// using Linked Lists#include 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 then 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 then 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("\n2nd Number: ");    show(poly2);      poly = (struct Node*)malloc(sizeof(struct Node));      // Function add two polynomial numbers    polyadd(poly1, poly2, poly);      // Display resultant List    printf("\nAdded polynomial: ");    show(poly);      return 0;}

## Java

 import java.io.*;import java.util.Scanner;  class Polynomial {    public static Node addPolynomial(Node p1, Node p2)    {          Node a = p1, b = p2, newHead = new Node(0, 0),             c = newHead;          while (a != null || b != null) {              if (a == null) {                c.next = b;                break;            }            else if (b == null) {                c.next = a;                break;            }              else if (a.pow == b.pow) {                c.next = new Node(a.coeff + b.coeff, a.pow);                  a = a.next;                b = b.next;            }              else if (a.pow > b.pow) {                c.next = new Node(a.coeff, a.pow);                  a = a.next;            }              else if (a.pow < b.pow) {                c.next = new Node(b.coeff, b.pow);                  b = b.next;            }              c = c.next;        }          return newHead.next;    }}  // Utilities for Linked List Nodesclass Node {    int coeff;    int pow;    Node next;    Node(int a, int b)    {        coeff = a;        pow = b;        next = null;    }}  //Linked List main classclass LinkedList {        public static void main(String args[])    {          Node start1 = null, cur1 = null, start2 = null,             cur2 = null;          int[] list1_coeff = { 5, 4, 2 };        int[] list1_pow = { 2, 1, 0 };        int n = list1_coeff.length;          int i = 0;        while (n-- > 0) {            int a = list1_coeff[i];            int b = list1_pow[i];              Node ptr = new Node(a, b);              if (start1 == null) {                start1 = ptr;                cur1 = ptr;            }              else {                cur1.next = ptr;                cur1 = ptr;            }              i++;        }          int[] list2_coeff = { -5, -5 };        int[] list2_pow = { 1, 0 };        n = list2_coeff.length;          i = 0;        while (n-- > 0) {            int a = list2_coeff[i];            int b = list2_pow[i];              Node ptr = new Node(a, b);              if (start2 == null) {                start2 = ptr;                cur2 = ptr;            }              else {                cur2.next = ptr;                cur2 = ptr;            }              i++;        }          Polynomial obj = new Polynomial();          Node sum = obj.addPolynomial(start1, start2);          Node trav = sum;        while (trav != null) {            System.out.print(trav.coeff + "x^" + trav.pow);            if (trav.next != null)                System.out.print(" + ");            trav = trav.next;        }        System.out.println();    }}

## Python3

 # Python3 program to implement the approach  # Utilities for Linked List Nodesclass Node:          # Constructor to initialize a node    def __init__(self, a, b):        self.coeff = a;        self.pow = b;        self.next = None;  # Polynomial Class definitionclass Polynomial:          # Method to add two polynomials    def addPolynomial(self, p1, p2):          a = p1        b = p2        newHead = Node(0, 0)        c = newHead;          while (a != None or b != None):              if (a == None):                c.next = b;                break                          elif (b == None):                c.next = a;                break;                            elif (a.pow == b.pow):                c.next = Node(a.coeff + b.coeff, a.pow);                  a = a.next;                b = b.next;                            elif (a.pow > b.pow):                c.next = Node(a.coeff, a.pow);                  a = a.next;                            elif (a.pow < b.pow):                c.next = Node(b.coeff, b.pow);                  b = b.next;                            c = c.next;          return newHead.next;      # Driver Codestart1 = Nonecur1 = Nonestart2 = Nonecur2 = None;  list1_coeff = [ 5, 4, 2 ];list1_pow = [ 2, 1, 0 ];n = len(list1_coeff);  i = 0;while (n > 0):    a = list1_coeff[i];    b = list1_pow[i];      ptr =  Node(a, b);      if (start1 == None):        start1 = ptr;        cur1 = ptr;          else:        cur1.next = ptr;        cur1 = ptr;      i += 1    n -= 1  list2_coeff = [ -5, -5 ];list2_pow = [ 1, 0 ];n = len(list2_coeff);  i = 0;while (n > 0):    a = list2_coeff[i];    b = list2_pow[i];      ptr = Node(a, b);      if (start2 == None):        start2 = ptr;        cur2 = ptr;      else :        cur2.next = ptr;        cur2 = ptr;          n -= 1    i += 1    obj = Polynomial();  sum = obj.addPolynomial(start1, start2);  trav = sum;  # Displaying the resultwhile (trav != None):    print(trav.coeff, "x^", trav.pow, sep = "", end = "");    if (trav.next != None):        print(" + ", end = "");    trav = trav.next;  print()  # This code is contributed by phasing17

## C#

 // C# code to implement the approachusing System;  // Utilities for Linked List Nodesclass Node {    public int coeff;    public int pow;    public Node next;    public Node(int a, int b)    {        coeff = a;        pow = b;        next = null;    }}    // Polynomial class class Polynomial {    public  Node addPolynomial(Node p1, Node p2)    {          Node a = p1, b = p2, newHead = new Node(0, 0),             c = newHead;          while (a != null || b != null) {              if (a == null) {                c.next = b;                break;            }            else if (b == null) {                c.next = a;                break;            }              else if (a.pow == b.pow) {                c.next = new Node(a.coeff + b.coeff, a.pow);                  a = a.next;                b = b.next;            }              else if (a.pow > b.pow) {                c.next = new Node(a.coeff, a.pow);                  a = a.next;            }              else if (a.pow < b.pow) {                c.next = new Node(b.coeff, b.pow);                  b = b.next;            }              c = c.next;        }          return newHead.next;    }}    //Linked List main classclass LinkedList {        public static void Main(string[] args)    {          Node start1 = null, cur1 = null, start2 = null,             cur2 = null;          int[] list1_coeff = { 5, 4, 2 };        int[] list1_pow = { 2, 1, 0 };        int n = list1_coeff.Length;          int i = 0;        while (n-- > 0) {            int a = list1_coeff[i];            int b = list1_pow[i];              Node ptr = new Node(a, b);              if (start1 == null) {                start1 = ptr;                cur1 = ptr;            }              else {                cur1.next = ptr;                cur1 = ptr;            }              i++;        }          int[] list2_coeff = { -5, -5 };        int[] list2_pow = { 1, 0 };        n = list2_coeff.Length;          i = 0;        while (n-- > 0) {            int a = list2_coeff[i];            int b = list2_pow[i];              Node ptr = new Node(a, b);              if (start2 == null) {                start2 = ptr;                cur2 = ptr;            }              else {                cur2.next = ptr;                cur2 = ptr;            }              i++;        }          Polynomial obj = new Polynomial();          Node sum = obj.addPolynomial(start1, start2);          Node trav = sum;        while (trav != null) {            Console.Write(trav.coeff + "x^" + trav.pow);            if (trav.next != null)                Console.Write(" + ");            trav = trav.next;        }        Console.WriteLine();    }}    // This code is contributed by phasing17

## Javascript

 // JavaScript program to implement the approach    // Polynomial Class definitionclass Polynomial {          // Method to add two polynomials    addPolynomial(p1, p2)    {          let a = p1, b = p2, newHead = new Node(0, 0),            c = newHead;          while (a != null || b != null) {              if (a == null) {                c.next = b;                break;            }            else if (b == null) {                c.next = a;                break;            }              else if (a.pow == b.pow) {                c.next = new Node(a.coeff + b.coeff, a.pow);                  a = a.next;                b = b.next;            }              else if (a.pow > b.pow) {                c.next = new Node(a.coeff, a.pow);                  a = a.next;            }              else if (a.pow < b.pow) {                c.next = new Node(b.coeff, b.pow);                  b = b.next;            }              c = c.next;        }          return newHead.next;    }}  // Utilities for Linked List Nodesclass Node {          // Constructor to initialize a node    constructor(a, b)    {        this.coeff = a;        this.pow = b;        this.next = null;    }  }  // Driver Code  let start1    = null,    cur1 = null, start2 = null, cur2 = null;  let list1_coeff = [ 5, 4, 2 ];let list1_pow = [ 2, 1, 0 ];let n = list1_coeff.length;  let i = 0;while (n-- > 0) {    let a = list1_coeff[i];    let b = list1_pow[i];      let ptr = new Node(a, b);      if (start1 == null) {        start1 = ptr;        cur1 = ptr;    }      else {        cur1.next = ptr;        cur1 = ptr;    }      i++;}  let list2_coeff = [ -5, -5 ];let list2_pow = [ 1, 0 ];n = list2_coeff.length;  i = 0;while (n-- > 0) {    let a = list2_coeff[i];    let b = list2_pow[i];      let ptr = new Node(a, b);      if (start2 == null) {        start2 = ptr;        cur2 = ptr;    }      else {        cur2.next = ptr;        cur2 = ptr;    }      i++;}  let obj = new Polynomial();  let sum = obj.addPolynomial(start1, start2);  let trav = sum;    // Displaying the resultwhile (trav != null) {    process.stdout.write(trav.coeff + "x^" + trav.pow);    if (trav.next != null)        process.stdout.write(" + ");    trav = trav.next;}console.log();    // This code is contributed by phasing17

Output

1st Number: 5x^2+4x^1+2x^0
2nd Number: -5x^1-5x^0

Time Complexity: O(m + n) where m and n are number of nodes in first and second lists respectively.

Space Complexity: O(m+n), since we create a new linked list of size m + n to store the result of the addition of the two polynomials.

Simple and concise version of the above approach:

We will maintain a prev pointer that will point to the last node of resultant linked list. We will be modifying the same given nodes rather than creating new ones .The below code will provide you with more insight.

Thank you Nakshatra Chhillar for suggesting this simplification and contributing the code :

Implementation:

## C++

 #include using namespace std;  /* Link list Node */struct Node {    int coeff;    int pow;    struct Node* next;      Node(int c, int p)    {        coeff = c;        pow = p;        next = NULL;    }};void append(struct Node** head_ref, struct Node** tail_ref,            int new_data, int new_data1){    struct Node* new_node = new Node(new_data, new_data1);      if (*head_ref == NULL)        *head_ref = new_node;    else        (*tail_ref)->next = new_node;    *tail_ref = new_node;}void printList(struct Node* head){    struct Node* temp = head;      while (temp != NULL) {        printf("%d %d ", temp->coeff, temp->pow);        temp = temp->next;    }}Node* addPolynomial(Node* p1, Node* p2);void create_node(int x, int y, struct Node** temp){    struct Node *r, *z;    z = *temp;    if (z == NULL) {        r = new Node(x, y);        *temp = r;        r->next = NULL;    }    else {        r->next = new Node(x, y);        r = r->next;        r->next = NULL;    }}  /* Structure of Node usedstruct Node{    int coeff;    int pow;    struct Node* next;      Node(int c, int p){        coeff = c;        pow = p;        next = NULL;    }  };*/// 1st Number: 5x^2+4x^1+2x^0// 2nd Number: -5x^1-5x^0class Solution {public:    /* The below method print the required sum of polynomial    p1 and p2 as specified in output  */    Node* addPolynomial(Node* p1, Node* p2)    {        Node* res = new Node(            0, 0); // dummy node ...head of resultant list        Node* prev            = res; // pointer to last node of resultant list        // like Merge procedure :        while (p1 != NULL and p2 != NULL) {            if (p1->pow < p2->pow) {                prev->next = p2;                prev = p2;                p2 = p2->next;            }            else if (p1->pow > p2->pow) {                prev->next = p1;                prev = p1;                p1 = p1->next;            }            else {                p1->coeff = p1->coeff + p2->coeff;                prev->next = p1;                prev = p1;                p1 = p1->next;                p2 = p2->next;            }        }        if (p1 != NULL) {            prev->next = p1;        }        if (p2 != NULL) {            prev->next = p2;        }        return res->next;    }};  int main(){    struct Node *poly1 = NULL, *poly2 = NULL, *poly = NULL;    struct Node *tail1 = NULL, *tail2 = NULL;    // 1st Number: 5x^2+4x^1+2x^0    append(&poly1, &tail1, 5, 2);    append(&poly1, &tail1, 4, 1);    append(&poly1, &tail1, 2, 0);    // 2nd Number: -5x^1-5x^0    append(&poly2, &tail2, -5, 1);    append(&poly2, &tail2, -5, 0);    Solution obj;    Node* sum = obj.addPolynomial(poly1, poly2);    for (Node* ptr = sum; ptr; ptr = ptr->next) {        // printing polynomial        cout << ptr->coeff << "x^" << ptr->pow;        if (ptr->next)            cout << " + ";    }    cout << endl;}// contributed by Nakshatra Chhillar

## Java

 import java.util.*;  // 1st Number: 5x^2+4x^1+2x^0// 2nd Number: -5x^1-5x^0public class Solution {      // Driver code    public static void main(String args[])    {        // 1st Number: 5x^2+4x^1+2x^0        Node poly1 = new Node(5, 2);        append(poly1, 4, 1);        append(poly1, 2, 0);          // 2nd Number: -5x^1-5x^0        Node poly2 = new Node(-5, 1);        append(poly2, -5, 0);          Node sum = addPolynomial(poly1, poly2);        for (Node ptr = sum; ptr != null; ptr = ptr.next) {            // printing polynomial            System.out.print(ptr.coeff + "x^"                             + ptr.pow);            if (ptr.next != null)                System.out.print(" + ");        }        System.out.println();    }      // insert in linked list    public static void append(Node head, int coeff,                              int power)    {        Node new_node = new Node(coeff, power);        while (head.next != null) {            head = head.next;        }        head.next = new_node;    }      /* The below method print the required sum of polynomial    p1 and p2 as specified in output  */    public static Node addPolynomial(Node p1, Node p2)    {        Node res = new Node(            0, 0); // dummy node ...head of resultant list        Node prev            = res; // pointer to last node of resultant list        while (p1 != null && p2 != null) {            if (p1.pow < p2.pow) {                prev.next = p2;                prev = p2;                p2 = p2.next;            }            else if (p1.pow > p2.pow) {                prev.next = p1;                prev = p1;                p1 = p1.next;            }            else {                p1.coeff = p1.coeff + p2.coeff;                prev.next = p1;                prev = p1;                p1 = p1.next;                p2 = p2.next;            }        }        if (p1 != null) {            prev.next = p1;        }        else if (p2 != null) {            prev.next = p2;        }        return res.next;    }}  /* Link list Node */class Node {    public int coeff;    public int pow;    public Node next;      public Node(int c, int p)    {        this.coeff = c;        this.pow = p;        this.next = null;    }}  // This code is contributed by Tapesh(tapeshdua420)

## Python3

 # 1st Number: 5x^2+4x^1+2x^0# 2nd Number: -5x^1-5x^0  # Link list Nodeclass Node:    def __init__(self, c, p):        self.coeff = c        self.pow = p        self.next = None  # insert in linked listdef append(head, coeff, power):    new_node = Node(coeff, power)      while head.next != None:        head = head.next    head.next = new_node  # The below method print the required sum of polynomial p1 and p2 as specified in outputdef addPolynomial(p1, p2):    res = Node(0, 0)  # dummy node ...head of resultant list    prev = res  # pointer to last node of resultant list      while p1 != None and p2 != None:        if p1.pow < p2.pow:            prev.next = p2            prev = p2            p2 = p2.next        elif p1.pow > p2.pow:            prev.next = p1            prev = p1            p1 = p1.next        else:            p1.coeff += p2.coeff            prev.next = p1            prev = p1            p1 = p1.next            p2 = p2.next      if (p1 != None):        prev.next = p1      if (p2 != None):        prev.next = p2      return res.next    # Driver codeif __name__ == '__main__':      # 1st Number: 5x^2+4x^1+2x^0    poly1 = Node(5, 2)    append(poly1, 4, 1)    append(poly1, 2, 0)      # 2nd Number: -5x^1-5x^0    poly2 = Node(-5, 1)    append(poly2, -5, 0)      sum = addPolynomial(poly1, poly2)      ptr = sum    while ptr != None:        # printing polynomial        print(ptr.coeff, 'x^', ptr.pow, end="")        if ptr.next != None:            print(" + ", end="")        ptr = ptr.next    print()  # This code is contributed by Tapesh(tapeshdua420)

## Javascript

 // 1st Number: 5x^2+4x^1+2x^0// 2nd Number: -5x^1-5x^0 // Link list Nodeclass Node {    constructor(c, p) {        this.coeff = c;        this.pow = p;        this.next = null;    }} // insert in linked listfunction append(head, coeff, power) {    let new_node = new Node(coeff, power);    while (head.next != null) {        head = head.next;    }    head.next = new_node;} // The below method print the required sum of polynomial p1 and p2 as specified in outputfunction addPolynomial(p1, p2) {    let res = new Node(0, 0); // dummy node ...head of resultant list     let prev = res; // pointer to last node of resultant list     while (p1 != null && p2 != null) {        if (p1.pow < p2.pow) {            prev.next = p2;            prev = p2;            p2 = p2.next;        } else if (p1.pow > p2.pow) {            prev.next = p1;            prev = p1;            p1 = p1.next;        } else {            p1.coeff += p2.coeff;            prev.next = p1;            prev = p1;            p1 = p1.next;            p2 = p2.next;        }    }     if (p1 != null) {        prev.next = p1;    }    if (p2 != null) {        prev.next = p2;    }    return res.next;} // Driver code // 1st Number: 5x^2+4x^1+2x^0poly1 = new Node(5, 2)append(poly1, 4, 1)append(poly1, 2, 0) // 2nd Number: -5x^1-5x^0poly2 = new Node(-5, 1)append(poly2, -5, 0) sum = addPolynomial(poly1, poly2) ptr = sum;while (ptr != null){    // printing polynomial   process.stdout.write(ptr.coeff + 'x^' + ptr.pow);    if(ptr.next != null){        process.stdout.write(" + ")    }    ptr = ptr.next;}console.log(); // This code is contributed by Tapesh(tapeshdua420).

Output

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.

Space Complexity: O(1) no extra nodes have been created

Recursive Method :

Algorithm :

1. If both the numbers are null then return
2. else if compare the power, if same then  add the coefficients and recursively call  addPolynomials on the next elements of both the numbers.
3. else if the power of first number is greater then print the current element of first number and recursively call addPolynomial on the next element of the first number and current element of the second number.
4. 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.

Implementation:



Output

5x^2 4x^1