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 []