Это один из вопросов программирования, заданных во время письменного теста Microsoft. Я задаю вопрос и ответ, который я придумал. Вещь - это мой ответ, хотя выглядит всесторонне (по крайней мере для меня), я чувствую, что количество строк можно уменьшить. Его спросили в C, и я человек Java, но мне удалось его закодировать (мой ответ может содержать слишком много Java-подобных синтаксисов)
Хорошо, вот вопрос.
У вас есть два списка, которые уже вы должны объединить их и вернуть новый список без каких-либо дополнительных дополнительных узлы. Возвращенный список должен быть также отсортированы.
Подпись метода:
Node* MergeLists(Node* list1, Node* list2);
struct Node{
int data;
Node *next;
}
Ниже приведено решение, которое я придумал,
Node* MergeLists(Node* list1, Node* list2){
Node* mergedList;
if(list1 == null && list2 ==null){//if both are null, return null
return null;
}
if(list1 == null){//if list1 is null, simply return list2
return list2;
}
if(list2 == null){//if list2 is null, simply return list1
return list1;
}
if(list1.data < list2.data){//initialize mergedList pointer to list1 if list1 data is lesser
mergedList = list1;
}else{//initialize mergedList pointer to list2 if list2 data is lesser or equal
mergedList = list2;
}
while(list1!=null && list2!=null){
if(list1.data < list2.data){
mergedList->next = list1;
list1 = list1->next;
}else{
mergedList->next = list2;
list2 = list2->next;
}
}
if(list1 == null){//remaining nodes of list2 appended to mergedList when list1 has reached its end.
mergedList->next = list2;
}else{//remaining nodes of list1 appended to mergedList when list2 has reached its end
mergedList->next = list1;
}
return mergedList;
}
Я очень уверен, что это можно улучшить. Пожалуйста, помогите мне найти, какие строки излишне добавлены. Пожалуйста, не стесняйтесь критиковать мои синтаксические ошибки и логику.
Спасибо!