LeetCode 445. Add Two Numbers II in F#

URL

https://leetcode.com/problems/add-two-numbers-ii/

Code

https://github.com/syohex/dotnet-study/blob/master/fsharp/leetcode/problems/0445/main.fsx

type ListNode =
    | Leaf
    | Node of int * ListNode

let addTwoNumbers (l1: ListNode) (l2: ListNode) : ListNode =
    let toReverseNums lst =
        let rec toReverseNums' lst acc =
            match lst with
            | Leaf -> acc
            | Node(v, n) -> toReverseNums' n (v :: acc)

        toReverseNums' lst []

    let rec numsToList nums =
        match nums with
        | [] -> Leaf
        | h :: t -> Node(h, numsToList t)

    let rec addTwoNumbers' nums1 nums2 carry acc =
        match nums1, nums2 with
        | [], [] ->
            if carry >= 1 then
                numsToList (carry :: acc)
            else
                numsToList acc
        | h :: t, [] ->
            let sum = h + carry

            if sum >= 10 then
                addTwoNumbers' t [] 1 ((sum % 10) :: acc)
            else
                addTwoNumbers' t [] 0 (sum :: acc)
        | [], h :: t ->
            let sum = h + carry

            if sum >= 10 then
                addTwoNumbers' [] t 1 ((sum % 10) :: acc)
            else
                addTwoNumbers' [] t 0 (sum :: acc)
        | h1 :: t1, h2 :: t2 ->
            let sum = h1 + h2 + carry

            if sum >= 10 then
                addTwoNumbers' t1 t2 1 ((sum % 10) :: acc)
            else
                addTwoNumbers' t1 t2 0 (sum :: acc)

    let nums1, nums2 = toReverseNums l1, toReverseNums l2
    addTwoNumbers' nums1 nums2 0 []