用数据结构编写下面程序:合并有序链表,已知两个非降序序列S1和S2,请构造S1与S2合并后的非降序序列S3
时间: 2024-06-16 10:02:45 浏览: 121
要合并两个有序链表S1和S2,可以使用双指针法来实现。具体步骤如下:
1. 创建一个新的链表S3,用于存储合并后的结果。
2. 初始化两个指针p1和p2,分别指向S1和S2的头节点。
3. 比较p1和p2指向的节点的值,将较小的节点添加到S3中,并将对应链表的指针后移一位。
4. 重复步骤3,直到其中一个链表遍历完毕。
5. 将剩余未遍历完的链表直接连接到S3的末尾。
6. 返回S3作为合并后的结果。
下面是用C++语言实现合并有序链表的代码示例:
```cpp
#include <iostream>
struct ListNode {
int val;
ListNode* next;
ListNode(int x) : val(x), next(nullptr) {}
};
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
ListNode dummy(0); // 创建一个虚拟头节点
ListNode* p = &dummy; // 指针p指向虚拟头节点
while (l1 && l2) {
if (l1->val <= l2->val) {
p->next = l1;
l1 = l1->next;
} else {
p->next = l2;
l2 = l2->next;
}
p = p->next;
}
// 将剩余未遍历完的链表直接连接到S3的末尾
p->next = l1 ? l1 : l2;
return dummy.next;
}
int main() {
// 创建两个有序链表
ListNode* l1 = new ListNode(1);
l1->next = new ListNode(3);
l1->next->next = new ListNode(5);
ListNode* l2 = new ListNode(2);
l2->next = new ListNode(4);
l2->next->next = new ListNode(6);
// 合并两个有序链表
ListNode* mergedList = mergeTwoLists(l1, l2);
// 打印合并后的结果
while (mergedList) {
std::cout << mergedList->val << " ";
mergedList = mergedList->next;
}
return 0;
}
```
阅读全文