LeetCode-in-All

148. Sort List

Medium

Given the head of a linked list, return the list after sorting it in ascending order.

Example 1:

Input: head = [4,2,1,3]

Output: [1,2,3,4]

Example 2:

Input: head = [-1,5,3,4,0]

Output: [-1,0,3,4,5]

Example 3:

Input: head = []

Output: []

Constraints:

Follow up: Can you sort the linked list in O(n logn) time and O(1) memory (i.e. constant space)?

Solution

%% Definition for singly-linked list.
%%
%% -record(list_node, {val = 0 :: integer(),
%%                     next = null :: 'null' | #list_node{}}).

%% @spec sort_list(Head :: #list_node{} | null) -> #list_node{} | null.
-spec sort_list(Head :: #list_node{} | null) -> #list_node{} | null.
sort_list(Head) ->
    List = node_to_list(Head, []),
    SortedList = lists:sort(fun(X, Y) -> X > Y end, List),
    list_to_node(SortedList, null).

%% Converts a linked list to an Erlang list.
-spec node_to_list(Node :: #list_node{} | null, Acc :: [integer()]) -> [integer()].
node_to_list(null, Acc) ->
    Acc;
node_to_list(#list_node{val = Val, next = Next}, Acc) ->
    node_to_list(Next, [Val | Acc]).

%% Converts an Erlang list to a linked list.
-spec list_to_node(List :: [integer()], Node :: #list_node{} | null) -> #list_node{} | null.
list_to_node([], Node) ->
    Node;
list_to_node([H | T], Node) ->
    list_to_node(T, #list_node{val = H, next = Node}).