编写合并函数,将两个有序的单链表合并成一个有序单链表
时间: 2023-06-05 14:47:22 浏览: 255
可以使用递归的方法来实现合并两个有序的单链表。
具体步骤如下:
1. 如果其中一个链表为空,则直接返回另一个链表。
2. 比较两个链表的头节点,将较小的节点作为合并后链表的头节点。
3. 递归调用合并函数,将剩余的节点继续合并。
4. 返回合并后的链表。
代码如下:
```
struct ListNode* merge(struct ListNode* l1, struct ListNode* l2) {
if (l1 == NULL) return l2;
if (l2 == NULL) return l1;
if (l1->val < l2->val) {
l1->next = merge(l1->next, l2);
return l1;
} else {
l2->next = merge(l1, l2->next);
return l2;
}
}
```
其中,l1和l2分别表示两个有序的单链表的头节点,返回合并后的有序单链表的头节点。
相关问题
用c语言编写合并函数,将两个有序的单链表合并成一个有序的单链表
好的,我可以回答这个问题。合并两个有序的单链表需要先比较两个链表的当前节点值大小,然后将较小值的节点放入新的链表中。接着继续比较两个链表的下一节点值大小,重复上述步骤直到其中一个链表已经被遍历完毕,将另一个链表的剩余节点插入新的链表中即可。以下是合并函数的样例代码:
```c
#include <stdio.h>
#include <stdlib.h>
struct ListNode {
int val;
struct ListNode *next;
};
struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2) {
// 创建新链表头
struct ListNode* head = malloc(sizeof(struct ListNode));
head->val = 0;
head->next = NULL;
// 创建指向新链表节点的指针
struct ListNode* cur = head;
// 比较两个链表的当前节点值大小,并插入新链表中
while (l1 && l2) {
if (l1->val < l2->val) {
cur->next = l1;
l1 = l1->next;
} else {
cur->next = l2;
l2 = l2->next;
}
cur = cur->next;
}
// 将未遍历完的链表节点插入新链表尾部
cur->next = l1 ? l1 : l2;
// 返回新链表头
return head->next;
}
```
任务3:有序单链表的合并 有两个有序单链表LA和LB,其元素均为非递减的有序排列,请编写算法实现将这两个有序单链表合并为一个新的有序单链表。 要求:新表不能额外申请结点空间,要有效利用现有两个单链表的结点空间。 程序代码:
对于这个问题,我们可以使用迭代的方式来合并两个有序的单链表,而不需要额外的空间。以下是C语言的一个示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct ListNode {
int data;
struct ListNode* next;
} ListNode;
// 合并两个有序链表
ListNode* mergeTwoLists(ListNode* la, ListNode* lb) {
// 初始化结果链表
ListNode* result = NULL;
// 当其中一个链表为空时,直接返回另一个链表
if (la == NULL) {
return lb;
} else if (lb == NULL) {
return la;
}
// 比较两个链表当前节点的数据大小
if (la->data <= lb->data) {
// 结果链表接上LA的节点,并更新指针
result = la;
la = la->next;
} else {
// 结果链表接上LB的节点,并更新指针
result = lb;
lb = lb->next;
}
// 递归地继续比较并合并两个链表的剩余部分
return result == NULL ? lb : mergeTwoLists(la, lb);
}
// 打印链表
void printList(ListNode* head) {
ListNode* temp = head;
while (temp != NULL) {
printf("%d ", temp->data);
temp = temp->next;
}
printf("\n");
}
int main() {
// 创建两个例子的有序链表
// ...
// 实现LA和LB的初始化...
// 调用合并函数
ListNode* mergedHead = mergeTwoLists(LA, LB);
printf("Merged list: \n");
printList(mergedHead);
return 0;
}
```
这段代码定义了一个`mergeTwoLists`函数,它通过比较两个链表当前节点的值,选择较小的那个添加到结果链表中,并递归地处理剩余的链表。当其中一个链表变为NULL时,就返回另一个链表作为结果。在`main`函数里,你需要自己提供两个有序链表`LA`和`LB`的初始化。
阅读全文