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 = 5x^2 + 4x^1 + 2x^0 2nd number = 5x^1 + 5x^0 Output: 5x^2 + 9x^1 + 7x^0 Input: 1st number = 5x^3 + 4x^2 + 2x^0 2nd number = 5x^1 + 5x^0 Output: 5x^3 + 4x^2 + 5x^1 + 7x^0

`// C++ program for addition of two polynomials ` `// using Linked Lists ` `#include<bits/stdc++.h> ` `using` `namespace` `std; ` ` ` `// Node structure containing power and coefficient of variable ` `struct` `Node ` `{ ` ` ` `int` `coeff; ` ` ` `int` `pow` `; ` ` ` `struct` `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; ` ` ` `} ` `} ` ` ` `// Function Adding two polynomial numbers ` `void` `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 list ` `void` `show(` `struct` `Node *node) ` `{ ` `while` `(node->next != NULL) ` ` ` `{ ` ` ` `printf` `(` `"%dx^%d"` `, node->coeff, node->` `pow` `); ` ` ` `node = node->next; ` ` ` `if` `(node->next != NULL) ` ` ` `printf` `(` `" + "` `); ` ` ` `} ` `} ` ` ` `// Driver program ` `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)); ` ` ` ` ` `// Function add two polynomial numbers ` ` ` `polyadd(poly1, poly2, poly); ` ` ` ` ` `// Display resultant List ` ` ` `printf` `(` `"\nAdded polynomial: "` `); ` ` ` `show(poly); ` ` ` `return` `0; ` `} ` |

*chevron_right*

*filter_none*

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) where m and n are number of nodes in first and second lists respectively.

**Related Article: **Add two polynomial numbers using Arrays

This article is contributed by **Akash Gupta**. 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 write comments if you find anything incorrect, or you want to share more information about the topic discussed above.

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the **DSA Self Paced Course** at a student-friendly price and become industry ready.

## Recommended Posts:

- Adding two polynomials using Linked List using map
- Multiplication of two polynomials using Linked list
- Multiply two polynomials
- Program to add two polynomials
- Remainder Theorem - Polynomials | Class 9 Maths
- Create new linked list from two given linked list with greater element at each node
- XOR Linked List - A Memory Efficient Doubly Linked List | Set 1
- XOR Linked List – A Memory Efficient Doubly Linked List | Set 2
- Merge a linked list into another linked list at alternate positions
- Check if a linked list is Circular Linked List
- Convert singly linked list into circular linked list
- Difference between Singly linked list and Doubly linked list
- Convert Singly Linked List to XOR Linked List
- Construct a Maximum Sum Linked List out of two Sorted Linked Lists having some Common nodes
- Create a linked list from two linked lists by choosing max element at each position
- Length of longest palindrome list in a linked list using O(1) extra space
- Construct a Doubly linked linked list from 2D Matrix
- Sum of two numbers if the original ratio and new ratio obtained by adding a given number to each number is given
- Number of ways to obtain each numbers in range [1, b+c] by adding any two numbers in range [a, b] and [b, c]
- Count of carry operations on adding two Binary numbers