两个有序链表的合并操作
时间: 2023-12-12 15:03:56 浏览: 52
两个有序链表的合并操作可以通过迭代或递归的方式完成。
1. 迭代法:
- 创建一个新的链表作为结果链表。
- 比较两个链表的当前节点,将较小的节点加入结果链表,并将当前链表指针后移一位。
- 重复上一步,直到其中一个链表为空。
- 将另一个非空链表的剩余部分直接加入结果链表。
- 返回结果链表。
2. 递归法:
- 判断两个链表是否为空,如果有一个为空,则返回另一个链表。
- 比较两个链表的当前节点,将较小的节点作为合并后的链表的当前节点。
- 递归调用合并函数,将较小节点的下一个节点与另一个链表的当前节点进行比较,并将较小的节点作为下一个节点。
- 返回合并后的链表。
相关问题
c语言写两个有序链表合并
当我们需要合并两个有序链表时,我们可以使用迭代的方式来解决这个问题。首先,我们需要定义一个新的链表头节点,并设置一个指针用于遍历两个链表。然后,我们比较两个指针所指向的节点的值,将较小的节点添加到新链表中,并将指针向后移动。重复这个过程,直到其中一个链表遍历完毕。最后,将剩余链表的节点直接添加到新链表的末尾。
下面是使用C语言实现这个算法的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构体
struct ListNode {
int val;
struct ListNode* next;
};
// 创建新节点
struct ListNode* createNode(int val) {
struct ListNode* newNode = (struct ListNode*)malloc(sizeof(struct ListNode));
newNode->val = val;
newNode->next = NULL;
return newNode;
}
// 合并两个有序链表
struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2) {
// 创建一个新的链表头节点
struct ListNode* dummy = createNode(0);
// 用于遍历新链表和两个原始链表
struct ListNode* cur = dummy;
while (l1 != NULL && l2 != NULL) {
// 比较两个节点的值
if (l1->val <= l2->val) {
cur->next = l1;
l1 = l1->next;
} else {
cur->next = l2;
l2 = l2->next;
}
cur = cur->next;
}
// 将剩余链表的节点直接添加到新链表的末尾
if (l1 != NULL) {
cur->next = l1;
}
if (l2 != NULL) {
cur->next = l2;
}
return dummy->next;
}
// 打印链表
void printList(struct ListNode* head) {
struct ListNode* cur = head;
while (cur != NULL) {
printf("%d ", cur->val);
cur = cur->next;
}
printf("\n");
}
int main() {
// 创建两个有序链表
struct ListNode* l1 = createNode(1);
l1->next = createNode(3);
l1->next->next = createNode(5);
struct ListNode* l2 = createNode(2);
l2->next = createNode(4);
l2->next->next = createNode(6);
// 合并两个有序链表
struct ListNode* mergedList = mergeTwoLists(l1, l2);
// 打印合并后的链表
printf("Merged List: ");
printList(mergedList);
return 0;
}
```
运行上述代码,输出结果为:
```
Merged List: 1 2 3 4 5 6
```
这是将两个有序链表合并成一个有序链表的基本思路和实现方法。希望对你有帮助!
两个递增的有序链表合并
为了合并两个递增的有序链表,可以采用以下步骤:
1. 分别读入两组递增数据,构建两个递增的有序链表,并使用头指针指向链表头节点。由于要求结果链表仍使用原来两个链表的存储空间,不另外占用其他存储空间。
2. 初始化两个工作指针pa和pb,分别指向两个链表的首元结点。
3. 从首元结点开始进行比较,当pa和pb都未到达各自链表的表尾结点时,依次摘取其中较小者重新连接在结果链表的最后。如果两个表中的元素相等,只摘取一个表中的元素,删除该表中的元素,以确保合并后的链表中无重复元素。
4. 当其中一个链表到达表尾结点为空时,将另一个非空链表的剩余元素直接链接在结果链表的最后。
#### 引用[.reference_title]
- *1* [两个递增的有序链表的合并](https://blog.csdn.net/m0_58789064/article/details/123613239)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"]
- *2* *3* [将两个递增的有序链表合并为一个递增的有序链表](https://blog.csdn.net/weixin_60593311/article/details/126152188)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"]
[ .reference_list ]