Это классический код сортировки слиянием, в котором есть четыре случая при условии, что не оба списка исчерпаны:
- a исчерпано;
- b исчерпан;
- a <<em> b и
- a ≥ b .
Вы попытались объединить два первых случая, когда один из узлов является нулевым при сравнении, но, поскольку ваши списки могут иметь значение INT_MAX
, это решение не является надежным.
Запишите эти случаи в явном виде. Сначала небольшая вспомогательная функция, которая продвигает узел и возвращает значение:
static int advance(Node *nd)
{
int res = (*nd)->x;
*nd = (*nd)->next;
return res;
}
Теперь ваша фактическая функция очень проста:
int getMin(Node *list1, Node *list2)
{
assert(*list1 || *list2);
if (*list1 == NULL) return advance(list2);
if (*list2 == NULL) return advance(list1);
if ((*list1)->x < (*list2)->x) return advance(list1);
return advance(list2);
}
Посмотрите ее в действии на ideone .