用c++写一个单链表的合并
时间: 2023-06-11 22:07:57 浏览: 108
下面是用 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 == NULL) {
return l2;
}
if (l2 == NULL) {
return l1;
}
struct ListNode *head, *p;
if (l1->val < l2->val) {
head = l1;
l1 = l1->next;
} else {
head = l2;
l2 = l2->next;
}
p = head;
while (l1 != NULL && l2 != NULL) {
if (l1->val < l2->val) {
p->next = l1;
l1 = l1->next;
} else {
p->next = l2;
l2 = l2->next;
}
p = p->next;
}
if (l1 != NULL) {
p->next = l1;
}
if (l2 != NULL) {
p->next = l2;
}
return head;
}
void printList(struct ListNode *head) {
struct ListNode *p = head;
while (p != NULL) {
printf("%d ", p->val);
p = p->next;
}
printf("\n");
}
int main() {
struct ListNode *l1 = (struct ListNode*)malloc(sizeof(struct ListNode));
struct ListNode *l2 = (struct ListNode*)malloc(sizeof(struct ListNode));
struct ListNode *p1 = l1;
struct ListNode *p2 = l2;
for (int i = 1; i < 5; i++) {
p1->val = i * 2 - 1;
p1->next = (struct ListNode*)malloc(sizeof(struct ListNode));
p1 = p1->next;
p2->val = i * 2;
p2->next = (struct ListNode*)malloc(sizeof(struct ListNode));
p2 = p2->next;
}
p1->val = 9;
p1->next = NULL;
p2->val = 10;
p2->next = NULL;
printf("List1: ");
printList(l1);
printf("List2: ");
printList(l2);
struct ListNode *mergedList = mergeTwoLists(l1, l2);
printf("Merged list: ");
printList(mergedList);
return 0;
}
```
在上面的代码中,我们首先定义了一个 `struct ListNode` 结构体,用于表示单链表中的节点。然后我们实现了一个 `mergeTwoLists` 函数,用于合并两个有序的单链表。
这个函数的实现过程如下:
- 如果其中一个链表为空,则直接返回另一个链表。
- 从两个链表的头节点中选取一个值较小的节点作为新链表的头节点,并将其从原链表中删除。
- 依次比较两个链表中剩余的节点的值,选择较小的节点加入到新链表中,并将其从原链表中删除。
- 如果一个链表中的节点已经全部加入到新链表中,而另一个链表还有节点未加入,则将这些节点全部加入到新链表的尾部。
最后,我们在 `main` 函数中创建了两个有序的单链表,并将它们合并成一个有序的单链表。最后,我们打印出合并后的单链表中的所有节点的值。
阅读全文