Как объединить два списка без сортировки по этой ссылке ниже?

#c #merge #linked-list

Вопрос:

Этот код показывает вывод отсортированного списка, но мне нужен несортированный список. Кто-нибудь может мне помочь, пожалуйста? Кто-нибудь может сказать мне, где отсортирован код? Я не могу его найти. Мне просто нужно объединить эти два списка. Сначала перечислите один, затем список 2.

 #include lt;stdio.hgt; #include lt;stdlib.hgt;   struct node {  int data;  struct node *next; } *LLOne, *LLTwo, *mergedLL;  void initialize(){  LLOne = LLTwo = mergedLL = NULL; }   void insert(struct node **head, int num) {   struct node* newNode = (struct node*) malloc(sizeof(struct node));  newNode-gt;data = num;   newNode-gt;next = *head;   *head = newNode;  printf("Inserted Element : %dn", num); }  struct node* mergeLinkedList(struct node* LLTwo, struct node* LLOne){  struct node *resultHead, *resultTail, *temp;  resultHead = resultTail = NULL;  while(1){  /* */  if(LLOne == NULL){  resultTail-gt;next = LLTwo;  break;  }   if(LLTwo == NULL) {  resultTail-gt;next = LLOne;  break;  }    if(LLOne-gt;data lt;= LLTwo-gt;data){  temp = LLOne;  LLOne = LLOne-gt;next;  } else {  temp = LLTwo;  LLTwo = LLTwo-gt;next;  }   if(resultHead == NULL){  resultHead = resultTail = temp;  } else {  resultTail-gt;next = temp;  resultTail = temp;  }  resultTail-gt;next = NULL;  }   return resultHead; }   void printLinkedList(struct node *nodePtr) {  while (nodePtr != NULL) {  printf("%d", nodePtr-gt;data);  nodePtr = nodePtr-gt;next;  if(nodePtr != NULL)  printf("--gt;");  } }  int main() {  initialize();  insert(amp;LLOne, 2);  insert(amp;LLOne, 4);  insert(amp;LLOne, 7);  insert(amp;LLOne, 8);  insert(amp;LLOne, 10);  printLinkedList(LLOne);  printf("n");  insert(amp;LLTwo, 3);  insert(amp;LLTwo, 5);  insert(amp;LLTwo, 9);  insert(amp;LLTwo, 11);  insert(amp;LLTwo, 15);  printLinkedList(LLTwo);   mergedLL = mergeLinkedList(LLTwo, LLOne);  printf("nMerged Linked Listn");  printLinkedList(mergedLL);   return 0; }  

Комментарии:

1. Посмотрите на эту строку: if(LLOne-gt;data lt;= LLTwo-gt;data)

2. как я могу это решить?

3. Почему бы просто не позвонить insert , чтобы добавить все узлы из обоих списков в список слияния? Сначала скопируйте из первого списка, затем из второго списка.

4. Для минимального изменения: вам всегда нужна эта if роль. Просто удалите if() {} else {} и сделайте temp = LLOne; LLOne = LLOne-gt;next; Для хорошего решения: перепишите всю функцию, так как она не предназначена для этой задачи. Он создан для слияния, а не для объединения.

Ответ №1:

Объединение двух списков имеет мало общего с объединением отсортированных списков. Код, который вы ищете, намного проще, чем алгоритм слияния. По сути, вам нужно установить только одну next ссылку, чтобы конец первого списка ссылался на начало второго списка:

 struct node* tail(struct node* head) {  if (head != NULL) {  while (head-gt;next != NULL) {  head = head-gt;next;  }  }  return head; }  struct node* mergeLinkedList(struct node* LLOne, struct node* LLTwo){  if (LLOne == NULL) return LLTwo;  tail(LLOne)-gt;next = LLTwo;  return LLOne; }  

Обратите внимание, что я изменил порядок параметров. Мне показалось немного странным, что у вас они были в обратном порядке ( LLTwo а затем LLOne ). Итак, main вам следует позвонить вот так:

 mergedLL = mergeLinkedList(LLOne, LLTwo);  

Имейте в виду, что объединение списков, подобных этому, приведет к изменению первого списка (если он не был пустым). Поэтому, если вы напечатаете LLOne после этого вызова, вы действительно увидите объединенный список. То же самое было верно и для вашей первоначальной функции слияния.

Если вы хотите избежать этой мутации, вам нужно создать новый узел для каждого узла, который находится в первом списке, и установить только next ссылку на новый хвост.

Комментарии:

1. Как функция слияния работает с этим кодом? Вы не могли бы мне помочь?