编写一个算法,将两个有序线性表合并成一个有序线性表。用C语言
时间: 2024-09-23 19:16:24 浏览: 40
在C语言中,可以编写一个归并排序的思想来进行两个有序线性表的合并。这里提供一个基本的递归函数实现:
```c
#include <stdio.h>
// 定义结构体表示链表节点
typedef struct ListNode {
int val; // 节点值
struct ListNode *next; // 指向下一个节点的指针
} ListNode;
// 合并两个已排序的链表
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
// 创建新的头结点
ListNode* head = NULL;
ListNode* tail = NULL;
// 判断两个链表是否都为空
if (l1 == NULL) return l2;
if (l2 == NULL) return l1;
// 如果第一个链表的第一个节点小于第二个链表的第一个节点,则添加第一个链表的节点到结果
if (l1->val <= l2->val) {
if (head == NULL) {
head = tail = l1;
} else {
tail->next = l1;
tail = l1;
}
l1 = l1->next;
} else {
if (head == NULL) {
head = tail = l2;
} else {
tail->next = l2;
tail = l2;
}
l2 = l2->next;
}
// 递归处理剩余的链表
while (l1 != NULL && l2 != NULL) {
if (l1->val <= l2->val) {
if (tail == NULL) {
tail = l1;
} else {
tail->next = l1;
tail = l1;
}
l1 = l1->next;
} else {
if (tail == NULL) {
tail = l2;
} else {
tail->next = l2;
tail = l2;
}
l2 = l2->next;
}
}
// 将未遍历完的链表添加到结果中
if (l1 != NULL) {
tail->next = l1;
} else {
tail->next = l2;
}
return head;
}
// 打印链表
void printList(ListNode* node) {
while (node != NULL) {
printf("%d -> ", node->val);
node = node->next;
}
printf("NULL\n");
}
int main() {
// 创建两个示例链表
ListNode* list1 = malloc(sizeof(ListNode));
list1->val = 1;
list1->next = malloc(sizeof(ListNode));
list1->next->val = 3;
list1->next->next = NULL;
ListNode* list2 = malloc(sizeof(ListNode));
list2->val = 2;
list2->next = malloc(sizeof(ListNode));
list2->next->val = 4;
list2->next->next = NULL;
// 合并链表
ListNode* mergedList = mergeTwoLists(list1, list2);
// 打印合并后的链表
printList(mergedList);
return 0;
}
```
这个程序首先比较两个链表的第一个节点,然后逐个比较并添加较小的节点到新链表中,直到其中一个链表遍历完。剩下的部分则直接添加到新链表的末尾。
阅读全文