Это один из вопросов программирования, заданных во время письменного теста от 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's data is lesser
mergedList = list1;
}else{//initialize mergedList pointer to list2 if list2's 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;
}
Я очень уверен, что это можно улучшить. Пожалуйста, помогите мне найти, какие строки избыточно я добавил. Пожалуйста, не стесняйтесь критиковать мои синтаксические ошибки и логику.
Спасибо!