Я добавил комментарии к коду.Я также изменил if с <на <= в случае, если это использовалось для сортировки слиянием, где, если h1-> data == h2-> data, вы бы сначала хотели h1 для стабильности.Имейте в виду, что два списка уже отсортированы, эта функция просто объединяет их.
Функция рекурсивно следует за двумя списками, пропуская меньшие узлы, пока не достигнет конца одного из списков, в которомукажет, что конец этого списка устанавливается на остаток другого списка, а затем возвращается обратно по цепочке рекурсивных вызовов, продвигаясь назад по спискам, устанавливая меньшие узлы в следующих указателях, чтобы объединять списки от начала до конца.Это неэффективный способ объединения списков, поскольку он потребляет O (n) стекового пространства из-за рекурсии на каждом узле, но, вероятно, он предназначен для обучения, а не для эффективности.
// initial input parameters, h1 and h2 each point to already sorted lists
Node *merge(Node *h1, Node *h2)
{
if (!h1) // if h1 empty
return h2; // return h2
if (!h2) // if h2 empty
return h1; // return h1
if (h1->data <= h2->data) // if h1->data <= h2->data
{
h1->next = merge(h1->next, h2); // h1->next = smaller of {h1->next, h2}
return h1; // return h1
}
else // else h1->data > h2->data
{
h2->next = merge(h1, h2->next); // h2->next = smaller of {h1, h2->next}
return h2; // return h2
}
}