Open In App

Add number and its reverse represented by Linked List

Last Updated : 23 Mar, 2023
Improve
Improve
Like Article
Like
Save
Share
Report

Given a number represented by a linked list, write a function that returns the sum of that number with its reverse form, and returns the resultant linked list.

Note: Avoid modifying the original linked list.

Examples:

Input: 1->2->3->4 
Output: 5->5->5->5
Explanation: 

Input list:      1 2 3 4
Reverse list:  + 4 3 2 1
resultant list:  5 5 5 5

Input: 4->7->3->6
Output: 1->1->1->1->0 
Explanation: 

Input list:        4 7 3 6
reverse list:    + 6 3 7 4
resultant list:  1 1 1 1 0

Approach: The approach to solve the problem of adding linked lists and its reverse can be divided into the following steps:

  • Make a copy of the given linked list: To avoid modifying the original linked list, a copy of it is created.
  • Reverse the linked list: The reversed linked list is obtained by iteratively changing the next pointer of each node to point to the previous node.
  • Add the linked list and its reverse: The two linked lists (original linked list and its reverse) are added digit by digit, starting from the least significant digit. A carry variable is maintained while adding the digits.
  • Reverse the result of the addition: The result of the addition, which is in reverse order, is reversed back to obtain the final result.
  • Print the resultant linked list: The final resultant linked list is printed.

Below is the implementation of this approach.

C++




// C++ code of above approach
#include <bits/stdc++.h>
using namespace std;
 
// Define the structure of a
// node in the linked list
struct Node {
    int data;
    struct Node* next;
    Node(int x)
    {
        data = x;
        next = NULL;
    }
};
 
// Function to return the
// reverse of a linked list
Node* reverseList(Node* head)
{
    Node* prev = NULL;
    Node* cur = head;
    Node* next_ = NULL;
 
    while (cur != NULL) {
        next_ = cur->next;
        cur->next = prev;
        prev = cur;
        cur = next_;
    }
    return prev;
}
 
// Function to return the sum of two
// linked lists
Node* addTwoLists(Node* l1, Node* l2)
{
    Node* dummy = new Node(0);
    Node* cur = dummy;
    int carry = 0;
 
    while (l1 != NULL || l2 != NULL) {
        int x = l1 ? l1->data : 0;
        int y = l2 ? l2->data : 0;
        int sum = carry + x + y;
        carry = sum / 10;
        cur->next = new Node(sum % 10);
        cur = cur->next;
        if (l1) {
            l1 = l1->next;
        }
        if (l2) {
            l2 = l2->next;
        }
    }
    if (carry > 0) {
        cur->next = new Node(carry);
    }
    return dummy->next;
}
 
// Function to print a linked list
void printList(Node* head)
{
    while (head != NULL) {
        cout << head->data << " ";
        head = head->next;
    }
    cout << endl;
}
 
// Function to create a copy of
// a linked list
Node* copyList(Node* head)
{
    Node* cur = head;
    Node* dummy = new Node(0);
    Node* copy = dummy;
 
    while (cur != NULL) {
        copy->next = new Node(cur->data);
        copy = copy->next;
        cur = cur->next;
    }
    return dummy->next;
}
 
// Driver Code
int main()
{
 
    // Example linked list:
    // 1 -> 2 -> 3 -> 4
    Node* head1 = new Node(1);
    head1->next = new Node(2);
    head1->next->next = new Node(3);
    head1->next->next->next = new Node(4);
 
    // Printing original linked list
    cout << "Original linked list : ";
    printList(head1);
 
    // Step1 - Make a copy of original
    // linked list
    Node* newList = copyList(head1);
 
    // Step2 - Reverse a linked list
    Node* head2 = reverseList(newList);
 
    // Printing reversed linked list
    cout << "Reversed linked list : ";
    printList(head2);
 
    // Step3 - Addition of a original
    // linked list and its reverse
    Node* addition = addTwoLists(head1, head2);
 
    // Step4 - Reverse a addition
    // Linked list
    Node* result = reverseList(addition);
 
    // Step5 - Print the resultant
    // linked list
    cout << "Resultant linked list : ";
    printList(result);
 
    return 0;
}


Java




// Java code implementation for the above approach
import java.io.*;
import java.util.*;
 
// Define the structure of a node in the linked list
class Node {
  int data;
  Node next;
  Node(int x)
  {
    data = x;
    next = null;
  }
}
 
class GFG {
 
  // Function to return the reverse of a linked list
  static Node reverseList(Node head)
  {
    Node prev = null;
    Node cur = head;
    Node next_;
    while (cur != null) {
      next_ = cur.next;
      cur.next = prev;
      prev = cur;
      cur = next_;
    }
    return prev;
  }
 
  // Function to return the sum of two linked lists
  static Node addTwoLists(Node l1, Node l2)
  {
    Node dummy = new Node(0);
    Node cur = dummy;
    int carry = 0;
 
    while (l1 != null || l2 != null) {
      int x = l1 != null ? l1.data : 0;
      int y = l2 != null ? l2.data : 0;
      int sum = carry + x + y;
      carry = sum / 10;
      cur.next = new Node(sum % 10);
      cur = cur.next;
      if (l1 != null) {
        l1 = l1.next;
      }
      if (l2 != null) {
        l2 = l2.next;
      }
    }
    if (carry > 0) {
      cur.next = new Node(carry);
    }
    return dummy.next;
  }
 
  // Function to print a linked list
  static void printList(Node head)
  {
    while (head != null) {
      System.out.print(head.data + " ");
      head = head.next;
    }
    System.out.println();
  }
 
  // Function to create a copy of a linked list
  static Node copyList(Node head)
  {
    Node cur = head;
    Node dummy = new Node(0);
    Node copy = dummy;
 
    while (cur != null) {
      copy.next = new Node(cur.data);
      copy = copy.next;
      cur = cur.next;
    }
    return dummy.next;
  }
 
  public static void main(String[] args)
  {
    // Example linked list:
    // 1 -> 2 -> 3 -> 4
    Node head1 = new Node(1);
    head1.next = new Node(2);
    head1.next.next = new Node(3);
    head1.next.next.next = new Node(4);
 
    // Printing original linked list
    System.out.print("Original linked list : ");
    printList(head1);
 
    // Step1 - Make a copy of original linked list
    Node newList = copyList(head1);
 
    // Step2 - Reverse a linked list
    Node head2 = reverseList(newList);
 
    // Printing reversed linked list
    System.out.print("Reversed linked list : ");
    printList(head2);
 
    // Step3 - Addition of a original linked list and
    // its reverse
    Node addition = addTwoLists(head1, head2);
 
    // Step4 - Reverse a addition Linked list
    Node result = reverseList(addition);
 
    // Step5 - Print the resultant linked list
    System.out.print("Resultant linked list : ");
    printList(result);
  }
}
 
// This code is contributed by sankar


Python3




# python code of above approach
# Define the structure of a
# node in the linked list
 
 
class Node:
    def __init__(self, x):
        self.data = x
        self.next = None
 
# Function to return the
# reverse of a linked list
 
 
def reverseList(head):
    prev = None
    cur = head
    next_ = None
 
    while cur is not None:
        next_ = cur.next
        cur.next = prev
        prev = cur
        cur = next_
    return prev
 
# Function to return the sum of two
# linked lists
 
 
def addTwoLists(l1, l2):
    dummy = Node(0)
    cur = dummy
    carry = 0
 
    while l1 is not None or l2 is not None:
        x = l1.data if l1 else 0
        y = l2.data if l2 else 0
        summ = carry + x + y
        carry = summ // 10
        cur.next = Node(summ % 10)
        cur = cur.next
        if l1:
            l1 = l1.next
        if l2:
            l2 = l2.next
    if carry > 0:
        cur.next = Node(carry)
    return dummy.next
 
# Function to print a linked list
 
 
def printList(head):
    while head is not None:
        print(head.data, end=" ")
        head = head.next
    print()
 
# Function to create a copy of
# a linked list
 
 
def copyList(head):
    cur = head
    dummy = Node(0)
    copy = dummy
 
    while cur is not None:
        copy.next = Node(cur.data)
        copy = copy.next
        cur = cur.next
    return dummy.next
 
 
# Driver Code
if __name__ == '__main__':
 
    # Example linked list:
    # 1 -> 2 -> 3 -> 4
    head1 = Node(1)
    head1.next = Node(2)
    head1.next.next = Node(3)
    head1.next.next.next = Node(4)
 
    # Printing original linked list
    print("Original linked list : ", end="")
    printList(head1)
 
    # Step1 - Make a copy of original
    # linked list
    newList = copyList(head1)
 
    # Step2 - Reverse a linked list
    head2 = reverseList(newList)
 
    # Printing reversed linked list
    print("Reversed linked list : ", end="")
    printList(head2)
 
    # Step3 - Addition of a original
    # linked list and its reverse
    addition = addTwoLists(head1, head2)
 
    # Step4 - Reverse a addition
    # Linked list
    result = reverseList(addition)
 
    # Step5 - Print the resultant
    # linked list
    print("Resultant linked list : ", end="")
    printList(result)


C#




// C# code implementation for the above approach
 
using System;
 
// Define the structure of a node in the linked list
public class Node {
    public int data;
    public Node next;
    public Node(int x)
    {
        data = x;
        next = null;
    }
}
 
public class GFG {
 
    // Function to return the reverse of a linked list
    static Node reverseList(Node head)
    {
        Node prev = null;
        Node cur = head;
        Node next_;
        while (cur != null) {
            next_ = cur.next;
            cur.next = prev;
            prev = cur;
            cur = next_;
        }
        return prev;
    }
 
    // Function to return the sum of two linked lists
    static Node addTwoLists(Node l1, Node l2)
    {
        Node dummy = new Node(0);
        Node cur = dummy;
        int carry = 0;
 
        while (l1 != null || l2 != null) {
            int x = l1 != null ? l1.data : 0;
            int y = l2 != null ? l2.data : 0;
            int sum = carry + x + y;
            carry = sum / 10;
            cur.next = new Node(sum % 10);
            cur = cur.next;
            if (l1 != null) {
                l1 = l1.next;
            }
            if (l2 != null) {
                l2 = l2.next;
            }
        }
        if (carry > 0) {
            cur.next = new Node(carry);
        }
        return dummy.next;
    }
 
    // Function to print a linked list
    static void printList(Node head)
    {
        while (head != null) {
            Console.Write(head.data + " ");
            head = head.next;
        }
        Console.WriteLine();
    }
 
    // Function to create a copy of a linked list
    static Node copyList(Node head)
    {
        Node cur = head;
        Node dummy = new Node(0);
        Node copy = dummy;
 
        while (cur != null) {
            copy.next = new Node(cur.data);
            copy = copy.next;
            cur = cur.next;
        }
        return dummy.next;
    }
 
    static public void Main()
    {
 
        // Code
        // Example linked list:
        // 1 -> 2 -> 3 -> 4
        Node head1 = new Node(1);
        head1.next = new Node(2);
        head1.next.next = new Node(3);
        head1.next.next.next = new Node(4);
 
        // Printing original linked list
        Console.Write("Original linked list : ");
        printList(head1);
 
        // Step1 - Make a copy of original linked list
        Node newList = copyList(head1);
 
        // Step2 - Reverse a linked list
        Node head2 = reverseList(newList);
 
        // Printing reversed linked list
        Console.Write("Reversed linked list : ");
        printList(head2);
 
        // Step3 - Addition of a original linked list and
        // its reverse
        Node addition = addTwoLists(head1, head2);
 
        // Step4 - Reverse a addition Linked list
        Node result = reverseList(addition);
 
        // Step5 - Print the resultant linked list
        Console.Write("Resultant linked list : ");
        printList(result);
    }
}
 
// This code is contributed by karthik.


Javascript




// JavaScript code of above approach
// Define the structure of a
// node in the linked list
 
class Node {
constructor(x) {
this.data = x;
this.next = null;
}
}
 
// Function to return the
// reverse of a linked list
 
function reverseList(head) {
let prev = null;
let cur = head;
let next_ = null;
while (cur !== null) {
    next_ = cur.next;
    cur.next = prev;
    prev = cur;
    cur = next_;
}
return prev;
}
 
// Function to return the sum of two
// linked lists
 
function addTwoLists(l1, l2) {
let dummy = new Node(0);
let cur = dummy;
let carry = 0;
while (l1 !== null || l2 !== null) {
    let x = l1 ? l1.data : 0;
    let y = l2 ? l2.data : 0;
    let summ = carry + x + y;
    carry = Math.floor(summ / 10);
    cur.next = new Node(summ % 10);
    cur = cur.next;
    if (l1) {
        l1 = l1.next;
    }
    if (l2) {
        l2 = l2.next;
    }
}
if (carry > 0) {
    cur.next = new Node(carry);
}
return dummy.next;
}
 
// Function to print a linked list
 
function printList(head) {
while (head !== null) {
console.log(head.data, end=" ");
head = head.next;
}
console.log();
}
 
// Function to create a copy of
// a linked list
 
function copyList(head) {
let cur = head;
let dummy = new Node(0);
let copy = dummy;
while (cur !== null) {
    copy.next = new Node(cur.data);
    copy = copy.next;
    cur = cur.next;
}
return dummy.next;
}
 
// Driver Code
if (typeof require !== 'undefined' && require.main === module) {
    // Example linked list:
// 1 -> 2 -> 3 -> 4
let head1 = new Node(1);
head1.next = new Node(2);
head1.next.next = new Node(3);
head1.next.next.next = new Node(4);
 
// Printing original linked list
console.log("Original linked list : ");
printList(head1);
 
// Step1 - Make a copy of original
// linked list
let newList = copyList(head1);
 
// Step2 - Reverse a linked list
let head2 = reverseList(newList);
 
// Printing reversed linked list
console.log("Reversed linked list : ");
printList(head2);
 
// Step3 - Addition of a original
// linked list and its reverse
let addition = addTwoLists(head1, head2);
 
// Step4 - Reverse a addition
// Linked list
let result = reverseList(addition);
 
// Step5 - Print the resultant
// linked list
console.log("Resultant linked list : ");
printList(result);
}
 
//This code is contributed by shivamsharma215


Output

Original linked list : 1 2 3 4 
Reversed linked list : 4 3 2 1 
Resultant linked list : 5 5 5 5 

Time complexity: O(max(m, n)), where m and n are the lengths of the linked lists being added.
Auxiliary Space: O(max(m, n)), as the length of the resultant linked list can be at most one more than the length of the longer linked list. The copyList and reverseList functions have a time complexity of O(n), where n is the length of the linked list.



Like Article
Suggest improvement
Share your thoughts in the comments

Similar Reads