两个有序链表序列的合并C语言
时间: 2023-09-01 13:09:51 浏览: 106
两个有序链表序列的合并_C语言_
5星 · 资源好评率100%
可以使用指针操作来实现两个有序链表的合并,具体的实现过程如下:
```
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构体
struct ListNode {
int val;
struct ListNode *next;
};
struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2) {
// 创建一个哨兵节点
struct ListNode *dummy = (struct ListNode *)malloc(sizeof(struct ListNode));
dummy->val = 0;
dummy->next = NULL;
// 定义两个指针分别指向两个链表的头节点
struct ListNode *p1 = l1, *p2 = l2;
// 定义一个指针指向哨兵节点
struct ListNode *p = dummy;
// 如果两个链表都不为空,则比较两个链表的头节点的大小
while (p1 != NULL && p2 != NULL) {
if (p1->val < p2->val) {
p->next = p1;
p1 = p1->next;
} else {
p->next = p2;
p2 = p2->next;
}
p = p->next;
}
// 如果链表1不为空,则将链表1剩余部分添加到合并后的链表中
if (p1 != NULL) {
p->next = p1;
}
// 如果链表2不为空,则将链表2剩余部分添加到合并后的链表中
if (p2 != NULL) {
p->next = p2;
}
// 返回合并后的链表
return dummy->next;
}
// 主函数
int main() {
// 创建两个有序链表
struct ListNode *l1 = (struct ListNode *)malloc(sizeof(struct ListNode));
l1->val = 1;
struct ListNode *node1 = (struct ListNode *)malloc(sizeof(struct ListNode));
node1->val = 2;
l1->next = node1;
node1->next = NULL;
struct ListNode *l2 = (struct ListNode *)malloc(sizeof(struct ListNode));
l2->val = 1;
struct ListNode *node2 = (struct ListNode *)malloc(sizeof(struct ListNode));
node2->val = 3;
l2->next = node2;
node2->next = NULL;
// 合并两个有序链表
struct ListNode *mergedList = mergeTwoLists(l1, l2);
// 输出合并后的链表
while (mergedList != NULL) {
printf("%d ", mergedList->val);
mergedList = mergedList->next;
}
printf("\n");
return 0;
}
```
上述代码中,首先定义了一个哨兵节点(dummy)作为合并后的链表的头节点,然后定义了两个指针p1和p2分别指向两个链表的头节点,定义另外一个指针p指向哨兵节点。接着按照从小到大的顺序将两个链表的节点依次添加到合并后的链表中,最后返回合并后的链表即可。
阅读全文