LeetCode 82. Remove Duplicates from Sorted List II in F#

URL

leetcode.com/problems/remove-duplicates-fro..

Code

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

type LinkedList =
    | ListEnd
    | ListNode of int * LinkedList

    static member toList (lst: LinkedList) : int list =
        let rec toList' lst acc =
            match lst with
            | ListEnd -> acc |> List.rev
            | ListNode(v, rest) -> toList' rest (v :: acc)

        toList' lst []

let countDuplicateNode (head: LinkedList) : (int * int) list =
    let rec countDuplicateNode' head prev count acc =
        match head with
        | ListEnd -> ((prev, count) :: acc) |> List.rev
        | ListNode (v, rest) ->
            if v = prev then
                countDuplicateNode' rest prev (count + 1) acc
            else
                countDuplicateNode' rest v 1 ((prev, count) :: acc)

    match head with
    | ListEnd -> []
    | ListNode (v, rest) -> countDuplicateNode' rest v 1 []

let deleteDuplicates (head: LinkedList) : LinkedList =
    let rec deleteDuplicates' notDups =
        match notDups with
        | [] -> ListEnd
        | (v, _) :: rest -> ListNode(v, deleteDuplicates' rest)

    let nonDups =
        countDuplicateNode head
        |> List.filter (fun (_, count) -> count = 1)

    deleteDuplicates' nonDups