Given elements as nodes of the two singly linked lists. The task is to multiply these two linked lists, say L1 and L2.
Note: The output could be large take modulo 109+7.
Examples :
Input: LinkedList L1 : 3->2 , LinkedList L2 : 2
Output: 64 Explanation:
Multiplication of 32 and 2 gives 64.
Input: LinkedList L1: 1->0->0 , LinkedList L2 : 1->0
Output: 1000 Explanation:
Multiplication of 100 and 10 gives 1000.
Expected Time Complexity: O(max(n,m))
Expected Auxilliary Space: O(1)
where n is the size of L1 and m is the size of L2
Constraints:
1 <= number of nodes <= 9
0 <= node->data <= 9
Approach 01:
-
C++
-
Python
class solution { public: long long multiplyTwoLists(Node* firstList, Node* secondList) { Node* currentNode = firstList; std::string firstNumberString; while (currentNode != nullptr) { int digit = currentNode->data; firstNumberString += std::to_string(digit); currentNode = currentNode->next; } long long firstNumber = std::stoll(firstNumberString); currentNode = secondList; std::string secondNumberString; while (currentNode != nullptr) { int digit = currentNode->data; secondNumberString += std::to_string(digit); currentNode = currentNode->next; } long long secondNumber = std::stoll(secondNumberString); const long long modValue = 1000000007LL; return ((firstNumber % modValue) * (secondNumber % modValue)) % modValue; } };
class Solution: def multiply_two_lists(self, firstList: 'Node', secondList: 'Node') -> int: currentNode = firstList firstNumberString = "" while currentNode is not None: digit = currentNode.data firstNumberString += str(digit) currentNode = currentNode.next firstNumber = int(firstNumberString) currentNode = secondList secondNumberString = "" while currentNode is not None: digit = currentNode.data secondNumberString += str(digit) currentNode = currentNode.next secondNumber = int(secondNumberString) modValue = 1000000007 return ((firstNumber % modValue) * (secondNumber % modValue)) % modValue
Time Complexity
- Traversing the first list:
The algorithm traverses the entire first linked list to build the string representation of the number. If there are \(n_1\) nodes in the first list, this traversal takes \(O(n_1)\).
- Traversing the second list:
The algorithm traverses the entire second linked list to build the string representation of the number. If there are \(n_2\) nodes in the second list, this traversal takes \(O(n_2)\).
- Converting strings to integers:
The conversion of a string to a long long integer using
std::stoll()
takes \(O(n_1)\) and \(O(n_2)\) for the first and second lists, respectively, where \(n_1\) and \(n_2\) are the lengths of the number strings. - Multiplication:
Multiplying two long long integers takes constant time, \(O(1)\).
- Overall Time Complexity:
The overall time complexity is \(O(n_1 + n_2)\), where \(n_1\) is the length of the first list and \(n_2\) is the length of the second list.
Space Complexity
- Auxiliary Space:
Space is required for storing the string representations of the numbers. If the first list has \(n_1\) digits and the second list has \(n_2\) digits, the space used by the strings is \(O(n_1 + n_2)\). Additionally, the algorithm uses constant space for storing the final result and a few variables.
- Overall Space Complexity:
The overall space complexity is \(O(n_1 + n_2)\), where \(n_1\) and \(n_2\) are the lengths of the first and second linked lists, respectively.