两条升序链表合并成一条降序链表c语言
时间: 2024-11-22 16:20:47 浏览: 22
在C语言中,将两个升序链表合并成一个降序链表,首先我们需要遍历两个链表获取所有节点,然后按照降序顺序排列它们并插入到新的链表中。以下是步骤的一个简化实现:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构体
typedef struct Node {
int data;
struct Node* next;
} Node;
// 创建新节点
Node* createNode(int data) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = data;
newNode->next = NULL;
return newNode;
}
// 升序链表节点比较函数,用于排序
int compareNodes(const void* a, const void* b) {
return (*(const Node**)a)->data - (*(const Node**)b)->data;
}
// 合并升序链表为降序
Node* mergeSortedLists(Node* list1, Node* list2) {
// 结果链表头结点
Node* mergedList = NULL;
// 当两个链表都不为空时
while (list1 && list2) {
// 如果list1的节点值大于list2的节点值
if (compareNodes(&list1, &list2) > 0) {
// 插入list1的节点
if (!mergedList) {
mergedList = list1;
} else {
list1->next = mergedList;
}
list1 = list1->next;
} else {
// 否则插入list2的节点
if (!mergedList) {
mergedList = list2;
} else {
list2->next = mergedList;
}
list2 = list2->next;
}
}
// 将剩余的链表添加到结果链表
if (list1)
mergedList->next = list1;
else
mergedList->next = list2;
return mergedList;
}
// 打印链表
void printList(Node* head) {
Node* temp = head;
while (temp) {
printf("%d ", temp->data);
temp = temp->next;
}
printf("\n");
}
int main() {
// 创建示例链表
Node* list1 = createNode(1);
list1->next = createNode(3);
list1->next->next = createNode(5);
Node* list2 = createNode(2);
list2->next = createNode(4);
list2->next->next = createNode(6);
Node* result = mergeSortedLists(list1, list2);
printList(result); // 输出:6 5 4 3 2 1
return 0;
}
```
在这个代码中,我们首先创建了一个比较函数`compareNodes`,用于在合并过程中保持降序。`mergeSortedLists`函数通过递归地比较和插入节点来完成任务。
阅读全文