One , Topic requirements
* Now there are 2 Single list , They're all in order ( from small to large ), Now I want you to merge two single linked lists into 1 Single list , After the merger, the linked list is still in order
* for example :
* list1 by 1,3,5
* list2 by 2,4,6
* take list1 and list2 Merge into new linked list list3, The value is 1,2,3,4,5,6
Two , Coding implementation
/** * @description: take temp Node inserted into head In the linked list * @param: head: The starting position of the linked list to insert temp:
The node pointer of the linked list to insert * @return: Returns the head node of the inserted linked list * @author: Dongshao */ Node
*insert_node(Node *head, Node *temp) { Node *p = head; Node *q = NULL; //
as long as q No p The value of the node is small , Then go back and forth while(p->_data < temp->_data && p != NULL) { q = p; p =
p->_pNext; } // If p be equal to head, explain temp than head All the nodes in the linked list are small , So will temp Insert into head before ,
Direct return temp That's fine if(p == head) { temp->_pNext = p; return temp; } //
Otherwise, it will temp Insert into head In the middle of the linked list q->_pNext = temp; temp->_pNext = p; return head; } /**
* @description: Merge two ordered linked lists ( from small to large ) * @param : list1: The first 1 Linked list list2: The first 2 Linked list * @return:
Returns the head node of the merged linked list * @author: Dongshao */ Node *merge2List(Node *list1, Node *list2) {
// If which list is empty , Then return to another linked list if (list1 == NULL) return list2; if (list2 == NULL)
return list1; Node *head; // Start with a long list Node *p; // Start with a shorter list Node *q; //
Direction and p Node after // Linked list 1 Comparison list 2 long if (listLength(list1) >= listLength(list2)) { head =
list1->_pNext; p = list2->_pNext; } else { head = list2->_pNext; p =
list1->_pNext; } // Which list is short , Just loop which short list to insert into the long list while (p != NULL) { q = p->_pNext;
// Save next node first head = insert_node(head, p); // take p Insert into head In the linked list p = q; } //
Returns the head node of the newly formed linked list return head; } /** * @description: Returns the length of the linked list * @param: _head: Head node of linked list
* @return: Returns the length of the linked list * @author: Dongshao */ size_t listLength(Node *_head) { if
(_head == NULL || _head->_pNext == NULL) return 0; size_t count; Node *temp =
_head->_pNext; while (temp != NULL) { count++; temp = temp->_pNext; } return
count; }
Three , test
* The test code is as follows #include <stdio.h> #include <stdlib.h> typedef struct node { struct
node *_pNext; int _data; } Node; Node *insert_node(Node *head, Node *temp);
Node *merge2List(Node *list1, Node *list2); Node *createList(int num); void
showList(Node *_head); size_t listLength(Node *_head); void freeList(Node
*_head); /** * @description: take temp Node inserted into head In the linked list * @param: head: The starting position of the linked list to insert
temp: The node pointer of the linked list to insert * @return: Returns the head node of the inserted linked list * @author: Dongshao */ Node
*insert_node(Node *head, Node *temp) { Node *p = head; Node *q = NULL; //
as long as q No p The value of the node is small , Then go back and forth while(p->_data < temp->_data && p != NULL) { q = p; p =
p->_pNext; } // If p be equal to head, explain temp than head All the nodes in the linked list are small , So will temp Insert into head before ,
Direct return temp That's fine if(p == head) { temp->_pNext = p; return temp; } //
Otherwise, it will temp Insert into head In the middle of the linked list q->_pNext = temp; temp->_pNext = p; return head; } /**
* @description: Merge two ordered linked lists ( from small to large ) * @param : list1: The first 1 Linked list list2: The first 2 Linked list * @return:
Returns the head node of the merged linked list * @author: Dongshao */ Node *merge2List(Node *list1, Node *list2) {
// If which list is empty , Then return to another linked list if (list1 == NULL) return list2; if (list2 == NULL)
return list1; Node *head; // Start with a long list Node *p; // Start with a shorter list Node *q; //
Direction and p Node after // Linked list 1 Comparison list 2 long if (listLength(list1) >= listLength(list2)) { head =
list1->_pNext; p = list2->_pNext; } else { head = list2->_pNext; p =
list1->_pNext; } // Which list is short , Just loop which short list to insert into the long list while (p != NULL) { q = p->_pNext;
// Save next node first head = insert_node(head, p); // take p Insert into head In the linked list p = q; } //
Returns the head node of the newly formed linked list return head; } /** * @description: Create linked list * @param: num: Number of nodes in linked list *
@return: Head pointer to create a new linked list * @author: Dongshao */ Node *createList(int num) { if (num <
0) return NULL; Node *_head = (Node *)malloc(sizeof(Node)); _head->_pNext =
NULL; Node *_tempHead = _head; Node *_newNode; for (int i = 0; i < num; ++i) {
// Create a new node _newNode = (Node *)malloc(sizeof(Node)); _newNode->_data = (i + 1);
_newNode->_pNext = NULL; // Offset backward _tempHead->_pNext = _newNode; _tempHead =
_newNode; _newNode = NULL; } return _head; } /** * @description: Print linked list * @param:
_head: Head node of linked list * @return: nothing * @author: Dongshao */ void showList(Node *_head) {
if (_head == NULL) return; Node *_tempNode = _head; // Circular printing while (_tempNode !=
NULL) { if (_tempNode->_pNext == NULL) break; else printf("%d->",
_tempNode->_data); _tempNode = _tempNode->_pNext; } // Print the printf("%d\n",
_tempNode->_data); } /** * @description: Returns the length of the linked list * @param: _head: Head node of linked list *
@return: Returns the length of the linked list * @author: Dongshao */ size_t listLength(Node *_head) { if
(_head == NULL || _head->_pNext == NULL) return 0; size_t count; Node *temp =
_head->_pNext; while (temp != NULL) { count++; temp = temp->_pNext; } return
count; } /** * @description: Destroy linked list * @param: _head: Head node of linked list * @return: nothing *
@author: Dongshao */ void freeList(Node *_head) { if (_head == NULL ||
_head->_pNext == NULL) return; Node *temp1 = _head->_pNext; Node *temp2; while
(temp1 != NULL) { temp2 = temp1->_pNext; free(temp1); temp1 = temp2; } } int
main() { Node *list1 = NULL, *list2 = NULL; // Create linked list , And print the linked list list1 =
createList(3); list2 = createList(3); // Forgery of the first list , Change its value to 1,3,5
list1->_pNext->_data = 1; list1->_pNext->_pNext->_data = 3;
list1->_pNext->_pNext->_pNext->_data = 5; // Forgery of the second linked list , Change its value to 2,4,6
list2->_pNext->_data = 2; list2->_pNext->_pNext->_data = 4;
list2->_pNext->_pNext->_pNext->_data = 6; showList(list1->_pNext);
showList(list2->_pNext); // Reverse linked list , And print the linked list Node *list3 = merge2List(list1, list2);
showList(list3); // Release linked list freeList(list1); freeList(list2); return 0; }
* give the result as follows :
Technology
Daily Recommendation