假设有两个按元素值递增次序列表的线性表,均以单链表形式存储。请编写算法将这两个单链表并为一个按元素值递减次序排列的单链表,并要求利用原来两个单链表的节点来制作归并后的单链表。
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node* next;
} Node;
// 插入节点函数
Node* insertNode(Node** head, int value) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = value;
newNode->next = *head;
*head = newNode;
return newNode;
}
// 合并两个递增有序链表为一个递减有序链表
Node* mergeListsDesc(Node* list1, Node* list2) {
if (list1 == NULL) return list2;
if (list2 == NULL) return list1;
Node* mergedHead = NULL; // 新链表头结点
Node** currentRef = &mergedHead; // 当前节点引用
while (list1 != NULL && list2 != NULL) {
if (list1->data > list2->data) {
*currentRef = list1;
list1 = list1->next;
} else {
*currentRef = list2;
list2 = list2->next;
}
currentRef = &((*currentRef)->next);
}
// 将剩余部分链接到合并链表的末尾
if (list1 != NULL) {
*currentRef = list1;
} else {
*currentRef = list2;
}
return mergedHead;
}
// 释放单链表
void freeList(Node* head) {
Node* temp = head;
Node* nextTemp;
while (temp != NULL) {
nextTemp = temp->next;
free(temp);
temp = nextTemp;
}
}
// 打印单链表
void printList(Node* head) {
Node* temp = head;
while (temp != NULL) {
printf("%d -> ", temp->data);
temp = temp->next;
}
puts("NULL");
}
int main() {
Node* list1 = NULL;
Node* list2 = NULL;
// 初始化并填充两个递增有序链表
insertNode(&list1, 5);
insertNode(&list1, 3);
insertNode(&list1, 8);
insertNode(&list2, 7);
insertNode(&list2, 2);
insertNode(&list2, 9);
printf("Original list 1: ");
printList(list1);
printf("Original list 2: ");
printList(list2);
// 合并为一个递减有序链表
Node* mergedList = mergeListsDesc(list1, list2);
printf("Merged and sorted in descending order: ");
printList(mergedList);
// 释放原始链表的内存
freeList(list1);
freeList(list2);
return 0;
}