合并两个有序链表,使之仍然有序 C语言
时间: 2023-07-11 15:47:29 浏览: 102
可以使用递归的方式来实现合并两个有序链表,以下是一个C语言的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
struct ListNode {
int val;
struct ListNode *next;
};
struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2) {
if (!l1) {
return l2;
}
if (!l2) {
return l1;
}
if (l1->val < l2->val) {
l1->next = mergeTwoLists(l1->next, l2);
return l1;
} else {
l2->next = mergeTwoLists(l1, l2->next);
return l2;
}
}
// 测试代码
int main() {
// 创建两个有序链表
struct ListNode *node1 = (struct ListNode *)malloc(sizeof(struct ListNode));
struct ListNode *node2 = (struct ListNode *)malloc(sizeof(struct ListNode));
struct ListNode *node3 = (struct ListNode *)malloc(sizeof(struct ListNode));
struct ListNode *node4 = (struct ListNode *)malloc(sizeof(struct ListNode));
node1->val = 1;
node2->val = 2;
node3->val = 4;
node4->val = 1;
node1->next = node2;
node2->next = node3;
node3->next = NULL;
node4->next = NULL;
// 合并两个有序链表
struct ListNode *result = mergeTwoLists(node1, node4);
// 输出合并后的链表
while (result) {
printf("%d ", result->val);
result = result->next;
}
// 释放内存
free(node1);
free(node2);
free(node3);
free(node4);
return 0;
}
```
在上面的代码中,我们定义了一个结构体`ListNode`表示链表节点,包含两个字段:`val`表示节点的值,`next`表示指向下一个节点的指针。`mergeTwoLists`函数使用递归的方式实现了合并两个有序链表的功能,具体实现方式如下:
- 如果`l1`为空,则返回`l2`;
- 如果`l2`为空,则返回`l1`;
- 如果`l1`的值小于`l2`的值,则将`l1->next`和`l2`合并,并返回`l1`;
- 如果`l2`的值小于等于`l1`的值,则将`l1`和`l2->next`合并,并返回`l2`。
最后我们创建了两个有序链表,并调用`mergeTwoLists`函数将它们合并,然后输出合并后的链表。需要注意的是,在实际使用中需要注意内存管理,避免内存泄漏。
阅读全文