LeetCode 92. Reverse Linked List II in F#

URL

leetcode.com/problems/reverse-linked-list-ii

Code

github.com/syohex/dotnet-study/blob/master/..

type List =
    | Leaf
    | Node of int * List

let reverseBetween (head: List) (left: int) (right: int) : List =
    let rec collectNums node i left right acc =
        if i > right then
            acc
        else
            match node with
            | Leaf -> failwith "never reach here"
            | Node (v, next) ->
                if i >= left then
                    collectNums next (i + 1) left right (v :: acc)
                else
                    collectNums next (i + 1) left right acc

    let rec reverseBetween' node i left right nums =
        match nums with
        | [] -> node
        | h :: t ->
            match node with
            | Leaf -> Leaf
            | Node (v, next) ->
                if i >= left then
                    Node(h, reverseBetween' next (i + 1) left right t)
                else
                    Node(v, reverseBetween' next (i + 1) left right nums)

    let nums = collectNums head 1 left right []
    reverseBetween' head 1 left right nums