C语言合并两个有序链表 返回其中一个链表
时间: 2023-07-10 12:23:36 浏览: 55
好的,我理解了你的问题。
以下是C语言代码,它可以将两个有序链表合并成一个,并返回其中一个链表(假设第一个链表为返回链表):
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表结构体
typedef struct Node {
int val;
struct Node* next;
} Node;
// 合并两个有序链表
Node* merge(Node* l1, Node* l2) {
// 定义返回链表和当前节点指针
Node* ret = l1;
Node* cur = l1;
// 判断链表是否为空
if (l1 == NULL) {
return l2;
}
if (l2 == NULL) {
return l1;
}
// 按照从小到大的顺序合并链表
if (l1->val < l2->val) {
cur = l1->next;
} else {
ret = l2;
cur = l2->next;
l2 = l1;
l1 = ret;
}
Node* prev = ret;
while (cur != NULL && l2 != NULL) {
if (l2->val < cur->val) {
prev->next = l2;
l2 = l2->next;
prev = prev->next;
prev->next = cur;
} else {
prev = cur;
cur = cur->next;
}
}
// 将剩余的节点添加到链表中
if (l2 != NULL) {
prev->next = l2;
}
// 返回链表
return ret;
}
// 创建新节点
Node* createNode(int val) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->val = val;
newNode->next = NULL;
return newNode;
}
// 输出链表
void printList(Node* head) {
Node* cur = head;
while (cur != NULL) {
printf("%d ", cur->val);
cur = cur->next;
}
printf("\n");
}
int main() {
// 创建两个有序链表
Node* l1 = createNode(1);
l1->next = createNode(3);
l1->next->next = createNode(5);
Node* l2 = createNode(2);
l2->next = createNode(4);
l2->next->next = createNode(6);
// 输出两个链表
printf("l1: ");
printList(l1);
printf("l2: ");
printList(l2);
// 合并链表并输出
Node* ret = merge(l1, l2);
printf("merged: ");
printList(ret);
return 0;
}
```
这段代码中,我们首先定义了一个链表的结构体 `Node`,然后定义了合并两个有序链表的函数 `merge`。在函数中,我们先判断了链表是否为空,并根据两个链表的节点值的大小比较,确定了返回链表和当前节点指针的初始值。接着,我们使用 `while` 循环来合并两个链表,直到其中一个链表为空。对于每一个节点值较小的链表节点,我们都将它插入到返回链表中,直到两个链表中有一个为空。最后,我们将剩余的节点加入到链表中,并返回返回链表的头指针。
在 `main` 函数中,我们创建了两个有序链表 `l1` 和 `l2`,并输出它们的值。然后,我们调用 `merge` 函数将两个链表合并,并输出合并后的链表。