假设链表a和链表b中的数据元素都是正整型数,并且都已按从小到大排序存放。请用c语言编程实现,将链表a与链表b合并,生成链表C,使链表C包含a、b中的全部元素,并且使C也是一个有序的链表。
时间: 2024-12-26 22:11:01 浏览: 0
在C语言中,可以使用迭代或者递归的方式实现两个已经排序的链表合并操作。这里我们提供一个迭代版本的示例:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构体
typedef struct ListNode {
int val;
struct ListNode *next;
} ListNode;
// 创建新节点
ListNode* createNode(int val) {
ListNode *newNode = (ListNode*)malloc(sizeof(ListNode));
newNode->val = val;
newNode->next = NULL;
return newNode;
}
// 合并两个有序链表
ListNode* mergeSortedLists(ListNode* a, ListNode* b) {
if (a == NULL) {
return b;
}
if (b == NULL) {
return a;
}
// 如果a比b小,则直接连接a和b的下一个节点
if (a->val <= b->val) {
a->next = mergeSortedLists(a->next, b);
return a;
} else {
b->next = mergeSortedLists(a, b->next);
return b;
}
}
// 打印链表
void printList(ListNode* head) {
while (head != NULL) {
printf("%d -> ", head->val);
head = head->next;
}
printf("NULL\n");
}
int main() {
// 初始化链表示例(实际应用中应通过用户输入或已排序数组创建)
ListNode* listA = createNode(1);
listA->next = createNode(4);
listA->next->next = createNode(7);
ListNode* listB = createNode(2);
listB->next = createNode(5);
listB->next->next = createNode(6);
// 合并链表
ListNode* mergedList = mergeSortedLists(listA, listB);
// 打印合并后的链表
printList(mergedList);
return 0;
}
```
在这个程序中,`mergeSortedLists`函数接收两个链表头指针,通过比较当前节点值的大小,将较小的节点连接到结果链表上,然后递归处理剩余部分,直到遍历完其中一个链表。
阅读全文