用C语言实现归并两个有序的带头节点的单链表,归并完成之后还是有序的
时间: 2024-04-14 18:27:19 浏览: 71
下面是一个使用C语言实现归并两个有序的带头节点的单链表的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表结点结构
typedef struct ListNode {
int data;
struct ListNode* next;
} ListNode;
// 创建新结点
ListNode* createNode(int data) {
ListNode* newNode = (ListNode*)malloc(sizeof(ListNode));
if (newNode == NULL) {
printf("内存分配失败!\n");
exit(1);
}
newNode->data = data;
newNode->next = NULL;
return newNode;
}
// 插入结点到链表末尾
void insertNode(ListNode** head, int data) {
ListNode* newNode = createNode(data);
if (*head == NULL) {
*head = newNode;
} else {
ListNode* curr = *head;
while (curr->next != NULL) {
curr = curr->next;
}
curr->next = newNode;
}
}
// 打印链表
void printList(ListNode* head) {
ListNode* curr = head;
while (curr != NULL) {
printf("%d ", curr->data);
curr = curr->next;
}
printf("\n");
}
// 归并两个有序链表
ListNode* mergeLists(ListNode* list1, ListNode* list2) {
if (list1 == NULL) {
return list2;
}
if (list2 == NULL) {
return list1;
}
ListNode* mergedList = NULL;
if (list1->data <= list2->data) {
mergedList = list1;
mergedList->next = mergeLists(list1->next, list2);
} else {
mergedList = list2;
mergedList->next = mergeLists(list1, list2->next);
}
return mergedList;
}
int main() {
ListNode* list1 = NULL;
insertNode(&list1, 2);
insertNode(&list1, 4);
insertNode(&list1, 6);
ListNode* list2 = NULL;
insertNode(&list2, 1);
insertNode(&list2, 3);
insertNode(&list2, 5);
printf("链表1:");
printList(list1);
printf("链表2:");
printList(list2);
ListNode* mergedList = mergeLists(list1, list2);
printf("合并后的链表:");
printList(mergedList);
return 0;
}
```
这段代码会创建两个有序的带头节点的单链表,并使用归并排序算法将两个链表合并为一个有序链表。在 `main` 函数中,我们插入了一些随机的整数,然后调用 `mergeLists` 函数进行归并,最后打印出合并后的链表。
阅读全文