From 0432d16315ce6e5cb57bf9a077de169fe50078f8 Mon Sep 17 00:00:00 2001 From: Shakil Ahmmed Date: Wed, 16 Feb 2022 23:59:30 +0600 Subject: [PATCH 1/3] Implement Add Two Numbers (Linked List) --- Data-Structures/Linked-List/AddTwoNumbers.js | 50 ++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 Data-Structures/Linked-List/AddTwoNumbers.js diff --git a/Data-Structures/Linked-List/AddTwoNumbers.js b/Data-Structures/Linked-List/AddTwoNumbers.js new file mode 100644 index 0000000000..cd281c1733 --- /dev/null +++ b/Data-Structures/Linked-List/AddTwoNumbers.js @@ -0,0 +1,50 @@ +/** + * A LinkedList based solution for Add Two Numbers + * + */ + +class ListNode { + constructor(data) { + this.data = data + this.next = null + } +} + +class AddTwoNumbers { + /* + Problem Statement: + Given two non-empty linked lists representing two non-negative integers. + The digits are stored in reverse order and each of their nodes contain a single digit. + Add the two numbers and return it as a linked list. + + Link for the Problem: https://leetcode.com/problems/add-two-numbers/ + */ + solution(firstList, secondList) { + let dummyNode = new ListNode(0) + let firstRunner = firstList + let secondRunner = secondList + let tail = dummyNode + let carry = 0 + while (firstRunner != null || secondRunner != null) { + let firstNumber = firstRunner ? firstRunner.data : 0 + let secondNumber = secondRunner ? secondRunner.data : 0 + let sum = carry + firstNumber + secondNumber + carry = parseInt(sum / 10) + tail.next = new ListNode(sum % 10) + tail = tail.next + if (firstRunner) { + firstRunner = firstRunner.next + } + if (secondNumber) { + secondNumber = secondNumber.next + } + } + if (carry > 0) { + tail.next = new ListNode(carry) + } + + return dummyNode.next + } +} + +export { AddTwoNumbers } From bba591aad6679cf8d82aad9242b7016aaa92a768 Mon Sep 17 00:00:00 2001 From: Shakil Ahmmed Date: Thu, 17 Feb 2022 00:07:05 +0600 Subject: [PATCH 2/3] Implement Add Two Numbers (Linked List) --- Data-Structures/Linked-List/AddTwoNumbers.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Data-Structures/Linked-List/AddTwoNumbers.js b/Data-Structures/Linked-List/AddTwoNumbers.js index cd281c1733..b244c6965d 100644 --- a/Data-Structures/Linked-List/AddTwoNumbers.js +++ b/Data-Structures/Linked-List/AddTwoNumbers.js @@ -35,8 +35,8 @@ class AddTwoNumbers { if (firstRunner) { firstRunner = firstRunner.next } - if (secondNumber) { - secondNumber = secondNumber.next + if (secondRunner) { + secondRunner = secondRunner.next } } if (carry > 0) { From 4204503758f1c60113285037a20026e6cc97ec7d Mon Sep 17 00:00:00 2001 From: Shakil Ahmmed Date: Thu, 17 Feb 2022 16:22:58 +0600 Subject: [PATCH 3/3] Implement Add Two Numbers (Linked List) --- Data-Structures/Linked-List/AddTwoNumbers.js | 55 +++++++++++-------- .../Linked-List/SinglyLinkedList.js | 2 +- .../Linked-List/test/AddTwoNumbers.test.js | 26 +++++++++ 3 files changed, 59 insertions(+), 24 deletions(-) create mode 100644 Data-Structures/Linked-List/test/AddTwoNumbers.test.js diff --git a/Data-Structures/Linked-List/AddTwoNumbers.js b/Data-Structures/Linked-List/AddTwoNumbers.js index b244c6965d..1664a6d1ed 100644 --- a/Data-Structures/Linked-List/AddTwoNumbers.js +++ b/Data-Structures/Linked-List/AddTwoNumbers.js @@ -2,35 +2,33 @@ * A LinkedList based solution for Add Two Numbers * */ +import { Node } from './SinglyLinkedList.js' -class ListNode { - constructor(data) { - this.data = data - this.next = null - } -} +/* +Problem Statement: +Given two non-empty linked lists representing two non-negative integers. +The digits are stored in reverse order and each of their nodes contain a single digit. +Add the two numbers and return it as a linked list. + +Link for the Problem: https://leetcode.com/problems/add-two-numbers/ +*/ class AddTwoNumbers { - /* - Problem Statement: - Given two non-empty linked lists representing two non-negative integers. - The digits are stored in reverse order and each of their nodes contain a single digit. - Add the two numbers and return it as a linked list. - - Link for the Problem: https://leetcode.com/problems/add-two-numbers/ - */ - solution(firstList, secondList) { - let dummyNode = new ListNode(0) + constructor () { + this.dummyNode = new Node(0) + } + + solution (firstList, secondList) { let firstRunner = firstList let secondRunner = secondList - let tail = dummyNode + let tail = this.dummyNode let carry = 0 while (firstRunner != null || secondRunner != null) { - let firstNumber = firstRunner ? firstRunner.data : 0 - let secondNumber = secondRunner ? secondRunner.data : 0 - let sum = carry + firstNumber + secondNumber + const firstNumber = firstRunner ? firstRunner.data : 0 + const secondNumber = secondRunner ? secondRunner.data : 0 + const sum = carry + firstNumber + secondNumber carry = parseInt(sum / 10) - tail.next = new ListNode(sum % 10) + tail.next = new Node(sum % 10) tail = tail.next if (firstRunner) { firstRunner = firstRunner.next @@ -40,10 +38,21 @@ class AddTwoNumbers { } } if (carry > 0) { - tail.next = new ListNode(carry) + tail.next = new Node(carry % 10) + } + + return this.dummyNode.next + } + + solutionToArray () { + const list = [] + let currentNode = this.dummyNode.next + while (currentNode) { + list.push(currentNode.data) + currentNode = currentNode.next } - return dummyNode.next + return list } } diff --git a/Data-Structures/Linked-List/SinglyLinkedList.js b/Data-Structures/Linked-List/SinglyLinkedList.js index 9a003f09a0..5559da797d 100644 --- a/Data-Structures/Linked-List/SinglyLinkedList.js +++ b/Data-Structures/Linked-List/SinglyLinkedList.js @@ -213,4 +213,4 @@ class LinkedList { } } -export { LinkedList } +export { Node, LinkedList } diff --git a/Data-Structures/Linked-List/test/AddTwoNumbers.test.js b/Data-Structures/Linked-List/test/AddTwoNumbers.test.js new file mode 100644 index 0000000000..caeb77f7fc --- /dev/null +++ b/Data-Structures/Linked-List/test/AddTwoNumbers.test.js @@ -0,0 +1,26 @@ +import { AddTwoNumbers } from '../AddTwoNumbers.js' +import { LinkedList } from '../SinglyLinkedList' + +describe('AddTwoNumbers', () => { + it('Check Sum Of Two Linked List', () => { + const list1 = new LinkedList() + list1.addFirst(2) + list1.addLast(4) + list1.addLast(3) + + const list2 = new LinkedList() + list2.addFirst(5) + list2.addLast(6) + list2.addLast(4) + + const expected = new LinkedList() + expected.addFirst(7) + expected.addLast(0) + expected.addLast(8) + + const addTwoLinkedList = new AddTwoNumbers() + addTwoLinkedList.solution(list1.headNode, list2.headNode) + + expect(addTwoLinkedList.solutionToArray()).toEqual(expected.get()) + }) +})