算法设计题:将两个非递减的有序链表合并为一个非递增的有序链表。要求结果链表仍使用原来两个链表的存储空间,不另外占用其他的存储空间。表中允许有重复的数据。用C语言写一个完整的程序
时间: 2024-09-22 14:06:36 浏览: 65
这个问题是经典的链表操作题目,通常被称为“合并两个有序链表”。在C语言中,我们可以创建一个新的头节点,并通过迭代或递归的方式来合并两个链表。以下是用C语言的一个简单解决方案:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node* next;
} Node;
Node* mergeSortedLists(Node* list1, Node* list2) {
// 创建新头节点并初始化为NULL
Node* head = NULL;
Node* tail = NULL;
// 当两个列表都不为空
while (list1 && list2) {
// 如果list1的数据小于或等于list2的数据
if (list1->data <= list2->data) {
// 将list1的节点添加到尾部
if (!head) {
head = list1;
tail = list1;
} else {
tail->next = list1;
tail = list1;
}
list1 = list1->next;
} else { // 否则,将list2的节点添加到尾部
if (!head) {
head = list2;
tail = list2;
} else {
tail->next = list2;
tail = list2;
}
list2 = list2->next;
}
}
// 如果其中一个链表已经遍历完,将另一个链表剩余部分添加到尾部
if (list1)
tail->next = list1;
else
tail->next = list2;
return head; // 返回合并后的链表头节点
}
// 测试函数
void printList(Node* node) {
while (node) {
printf("%d -> ", node->data);
node = node->next;
}
printf("NULL\n");
}
int main() {
// 初始化两个示例链表
Node* list1 = (Node*)malloc(sizeof(Node));
list1->data = 1;
list1->next = (Node*)malloc(sizeof(Node));
list1->next->data = 4;
list1->next->next = (Node*)malloc(sizeof(Node));
list1->next->next->data = 5;
list1->next->next->next = NULL;
Node* list2 = (Node*)malloc(sizeof(Node));
list2->data = 2;
list2->next = (Node*)malloc(sizeof(Node));
list2->next->data = 3;
list2->next->next = NULL;
// 合并链表
Node* mergedList = mergeSortedLists(list1, list2);
// 打印结果
printList(mergedList);
return 0;
}
```
这个程序首先检查每个链表的当前节点,然后根据节点值决定将哪一个节点添加到新链表的尾部。最后返回合并后的链表头节点。
阅读全文