Add Number Linked Lists

Given the head of two singly linked lists num1 and num2 representing two non-negative integers. The task is to return the head of the linked list representing the sum of these two numbers.

For example, num1 represented by the linked list : 1 -> 9 -> 0, similarly num2 represented by the linked list: 2 -> 5. Sum of these two numbers is represented by 2 -> 1 -> 5.

Note: There can be leading zeros in the input lists, but there should not be any leading zeros in the output list.

Examples:

Input: num1 = 4 - > 5, num2 = 3 -> 4 -> 5
Output: 3 -> 9 -> 0
Explanation: Given numbers are 45 and 345. There sum is 390.
Input: num1 = 0 -> 0 -> 6 -> 3, num2 = 0 -> 7 
Output: 7 -> 0
Explanation: Given numbers are 63 and 7. There sum is 70.

Constraints:
1 <= size of both linked lists <= 106
0 <= elements of both linked lists <= 9


Approach 01:

class Solution {
public:
    Node* reverseLinkedList(Node* head) {
        Node* previousNode = nullptr;
        Node* currentNode = head;
        while (currentNode) {
            Node* nextNode = currentNode->next;  // Save the next node
            currentNode->next = previousNode;    // Reverse the link
            previousNode = currentNode;          // Move previousNode to the current node
            currentNode = nextNode;              // Move to the next node
        }
        return previousNode;
    }

    Node* addTwoLists(Node* list1, Node* list2) {
        // Reverse both linked lists
        list1 = reverseLinkedList(list1);
        list2 = reverseLinkedList(list2);
        
        // Initialize result linked list and carry
        Node* resultHead = nullptr;
        int carryOver = 0;
        
        while (list1 || list2 || carryOver) {
            // Get values from the nodes or 0 if nullptr
            int value1 = list1 ? list1->data : 0;
            int value2 = list2 ? list2->data : 0;
            
            // Compute the sum and carry
            int totalSum = value1 + value2 + carryOver;
            carryOver = totalSum / 10;
            Node* newNode = new Node(totalSum % 10);
            
            // Insert at the head of the result list
            newNode->next = resultHead;
            resultHead = newNode;
            
            // Move to the next nodes in the input lists
            if (list1) list1 = list1->next;
            if (list2) list2 = list2->next;
        }

        // Remove leading zeros, if any
        while (resultHead && resultHead->data == 0 && resultHead->next) {
            resultHead = resultHead->next;
        }

        return resultHead;
    }
};
class Node:
    def __init__(self, data):
        self.data = data
        self.next = None

class Solution:
    def reverseLinkedList(self, head):
        previousNode = None
        currentNode = head
        while currentNode:
            nextNode = currentNode.next  # Save the next node
            currentNode.next = previousNode  # Reverse the link
            previousNode = currentNode  # Move previousNode to the current node
            currentNode = nextNode  # Move to the next node
        return previousNode
    
    def addTwoLists(self, list1, list2):
        # Reverse both linked lists
        list1 = self.reverseLinkedList(list1)
        list2 = self.reverseLinkedList(list2)
        
        # Initialize result linked list and carry
        resultHead = None
        carryOver = 0
        
        while list1 or list2 or carryOver:
            # Get values from the nodes or 0 if None
            value1 = list1.data if list1 else 0
            value2 = list2.data if list2 else 0
            
            # Compute the sum and carry
            totalSum = value1 + value2 + carryOver
            carryOver = totalSum // 10
            newNode = Node(totalSum % 10)
            
            # Insert at the head of the result list
            newNode.next = resultHead
            resultHead = newNode
            
            # Move to the next nodes in the input lists
            if list1: list1 = list1.next
            if list2: list2 = list2.next
        
        # Remove leading zeros, if any
        while resultHead and resultHead.data == 0 and resultHead.next:
            resultHead = resultHead.next

        return resultHead

Time Complexity:

  • Reversing Linked Lists:

    Reversing each of the two input linked lists takes \( O(m) \) and \( O(n) \), where \( m \) and \( n \) are the lengths of the two lists, respectively.

  • Summing Lists:

    Adding the two reversed lists involves iterating through both lists once, taking \( O(\max(m, n)) \).

  • Overall Time Complexity:

    The total time complexity is \( O(m + n) \).

Space Complexity:

  • Reversed Lists:

    Reversing the input lists is done in-place, requiring \( O(1) \) extra space.

  • Result List:

    A new linked list is created to store the result, which requires \( O(\max(m, n)) \) space.

  • Overall Space Complexity:

    The total space complexity is \( O(\max(m, n)) \).

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top