输入无序的元素,分别建立两个有3个结点的逆序单链表(有头结点)(显示排序后的链表),合并两个单链表使之仍然有序,显示合并后的单链表。 样例输入 4 6 8 5 7 9 样例输出 8 6 4 9 7 5 9 8 7 6 5 4用C语言简单编译
时间: 2024-12-13 13:27:06 浏览: 7
为了在C语言中实现这个功能,你需要创建一个链表节点结构、定义函数来构建逆序链表、合并两个链表并保持有序。以下是简化的代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
// 链表节点结构
typedef struct ListNode {
int data;
struct ListNode* next;
} ListNode;
// 创建一个新的链表节点
ListNode* createNode(int value) {
ListNode* newNode = (ListNode*)malloc(sizeof(ListNode));
newNode->data = value;
newNode->next = NULL;
return newNode;
}
// 将无序数组转换为逆序链表
ListNode* buildReversedList(int arr[], int size) {
ListNode* head = createNode(arr[size - 1]);
ListNode* tail = head;
for (int i = size - 2; i >= 0; i--) {
tail->next = createNode(arr[i]);
tail = tail->next;
}
return head;
}
// 合并两个已排序的链表
ListNode* mergeSortedLists(ListNode* list1, ListNode* list2) {
if (!list1 || !list2 || (list1->data <= list2->data && list2->next)) {
return list2;
} else if (!list2 || (list1->data < list2->data)) {
return list1;
}
ListNode* mergedHead = (list1->data < list2->data) ? list1 : list2;
mergedHead->next = mergeSortedLists(list1->next, list2);
return mergedHead;
}
// 打印链表
void printList(ListNode* head) {
while (head) {
printf("%d ", head->data);
head = head->next;
}
printf("\n");
}
int main() {
int input1[] = {4, 6, 8};
int input2[] = {5, 7, 9};
int n1 = sizeof(input1) / sizeof(input1[0]);
int n2 = sizeof(input2) / sizeof(input2[0]);
ListNode* list1 = buildReversedList(input1, n1);
ListNode* list2 = buildReversedList(input2, n2);
ListNode* mergedList = mergeSortedLists(list1, list2);
printList(mergedList); // 输出:9 8 7 6 5 4
return 0;
}
```
这个程序首先将给定的无序数组逆序地转换为链表,然后合并两个已排序的链表。注意,因为题目要求的是逆序链表,所以在构建链表时我们是从大到小放置元素。最后,`printList` 函数用于展示合并后的链表。
阅读全文