Skip to content

Commit

Permalink
✨ Recursive solutions to AddTwoNumbers
Browse files Browse the repository at this point in the history
  • Loading branch information
jobearrr committed Jul 4, 2024
1 parent 1be8bec commit 4880cab
Show file tree
Hide file tree
Showing 6 changed files with 152 additions and 23 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
//
// AddTwoNumbersRecursiveHelperSolution.swift
// LeetSwift
//
// Created by Jobert Sá on 04/07/2024.
//

import Core
import Foundation
import Problems

final class AddTwoNumbersRecursiveHelperSolution: AddTwoNumbersDefinition {

func addTwoNumbers(_ l1: ListNode?, _ l2: ListNode?) -> ListNode? {
addTwoNumbers(l1, l2, 0)
}

private func addTwoNumbers(
_ l1: ListNode?,
_ l2: ListNode?,
_ carry: Int
) -> ListNode? {

guard l1 != nil || l2 != nil || carry > 0 else { return nil }

let sum = (l1?.val ?? 0) + (l2?.val ?? 0) + carry
let resultNode = ListNode(sum % 10)
resultNode.next = addTwoNumbers(l1?.next, l2?.next, sum / 10)

return resultNode
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
//
// AddTwoNumbersRecursiveSolution.swift
// LeetSwift
//
// Created by Jobert Sá on 04/07/2024.
//

import Core
import Foundation
import Problems

final class AddTwoNumbersRecursiveSolution: AddTwoNumbersDefinition {

func addTwoNumbers(_ l1: ListNode?, _ l2: ListNode?) -> ListNode? {
guard let l1 else { return l2 }
guard let l2 else { return l1 }

let sum = l1.val + l2.val
let resultNode = ListNode(sum % 10)
let nextNode = addTwoNumbers(l1.next, l2.next)
if sum > 9 {
resultNode.next = addTwoNumbers(nextNode, ListNode(1))
} else {
resultNode.next = nextNode
}

return resultNode
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
//

import XCTest
@testable import Core
@testable import Problems
@testable import Solutions
@testable import TestSupport
Expand All @@ -26,25 +25,4 @@ final class AddTwoNumbersIterativeSolutionTests: XCTestCase {
}
}

extension AddTwoNumbersIterativeSolutionTests: TestCaseProviding {

func validateInput(_ input: (l1: ListNode?, l2: ListNode?)) -> Bool {
// TODO: Implement validation
true
}

var data: [TestData<(l1: ListNode?, l2: ListNode?), ListNode?>] { [
TestData(
input: ([2, 4, 3].listNode, [5, 6, 4].listNode),
expectedOutput: [7, 0, 8].listNode
),
TestData(
input: ([0].listNode, [0].listNode),
expectedOutput: [0].listNode
),
TestData(
input: ([9, 9, 9, 9, 9, 9, 9].listNode, [9, 9, 9, 9].listNode),
expectedOutput: [8, 9, 9, 9, 0, 0, 0, 1].listNode
)
] }
}
extension AddTwoNumbersIterativeSolutionTests: AddTwoNumbersTestCaseProvider { }
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
//
// AddTwoNumbersRecursiveHelperSolutionTests.swift
// LeetSwift
//
// Created by Jobert Sá on 04/07/2024.
//

import XCTest
@testable import Problems
@testable import Solutions
@testable import TestSupport

final class AddTwoNumbersRecursiveHelperSolutionTests: XCTestCase {

let solution: AddTwoNumbersDefinition = AddTwoNumbersRecursiveHelperSolution()

func testSolution() {
for testData in data {
let input = testData.input

let output = solution.addTwoNumbers(input.l1, input.l2)

XCTAssertEqual(output, testData.expectedOutput)
}
}
}

extension AddTwoNumbersRecursiveHelperSolutionTests: AddTwoNumbersTestCaseProvider { }
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
//
// AddTwoNumbersRecursiveSolutionTests.swift
// LeetSwift
//
// Created by Jobert Sá on 04/07/2024.
//

import XCTest
@testable import Problems
@testable import Solutions
@testable import TestSupport

final class AddTwoNumbersRecursiveSolutionTests: XCTestCase {

let solution: AddTwoNumbersDefinition = AddTwoNumbersRecursiveSolution()

func testSolution() {
for testData in data {
let input = testData.input

let output = solution.addTwoNumbers(input.l1, input.l2)

XCTAssertEqual(output, testData.expectedOutput)
}
}
}

extension AddTwoNumbersRecursiveSolutionTests: AddTwoNumbersTestCaseProvider { }
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
//
// AddTwoNumbersTestCaseProvider.swift
// LeetSwift
//
// Created by Jobert Sá on 04/07/2024.
//

@testable import Core
@testable import TestSupport

protocol AddTwoNumbersTestCaseProvider: TestCaseProviding { }

extension AddTwoNumbersTestCaseProvider {

func validateInput(_ input: (l1: ListNode?, l2: ListNode?)) -> Bool {
// TODO: Implement validation
true
}

var data: [TestData<(l1: ListNode?, l2: ListNode?), ListNode?>] { [
TestData(
input: ([2, 4, 3].listNode, [5, 6, 4].listNode),
expectedOutput: [7, 0, 8].listNode
),
TestData(
input: ([0].listNode, [0].listNode),
expectedOutput: [0].listNode
),
TestData(
input: ([9, 9, 9, 9, 9, 9, 9].listNode, [9, 9, 9, 9].listNode),
expectedOutput: [8, 9, 9, 9, 0, 0, 0, 1].listNode
)
] }
}

0 comments on commit 4880cab

Please sign in to comment.