7-3 两个有序链表序列的合并 分数 20 作者 DS课程组 单位 浙江大学 已知两个非降序链表序列S1与S2,设计函数构造出S1与S2合并后的新的非降序链表S3。 输入格式: 输入分两行,分别在每行给出由若干个正整数构成的非降序序列,用−1表示序列的结尾(−1不属于这个序列)。数字用空格间隔。 输出格式: 在一行中输出合并后新的非降序链表,数字间用空格分开,结尾不能有多余空格;若新链表为空,输出NULL。
时间: 2024-03-12 17:44:57 浏览: 190
两个有序链表序列的合并.md
好的,下面是完整的 C++ 代码实现:
```c++
#include <iostream>
using namespace std;
struct ListNode {
int value;
ListNode* next;
};
ListNode* merge(ListNode* head1, ListNode* head2) {
// 如果两个链表中有一个为空,则直接返回另一个链表的头指针
if (!head1) return head2;
if (!head2) return head1;
ListNode* p1 = head1;
ListNode* p2 = head2;
ListNode* newHead = new ListNode;
ListNode* p3 = newHead;
// 遍历两个链表,将较小值的节点插入到新链表中
while (p1 && p2) {
if (p1->value <= p2->value) {
p3->next = p1;
p1 = p1->next;
} else {
p3->next = p2;
p2 = p2->next;
}
p3 = p3->next;
}
// 将未遍历完的链表接到新链表的末尾
if (p1) p3->next = p1;
if (p2) p3->next = p2;
ListNode* ret = newHead->next;
delete newHead;
return ret;
}
int main() {
// 读入两个链表
ListNode* head1 = new ListNode;
ListNode* p1 = head1;
int num;
cin >> num;
while (num != -1) {
ListNode* newNode = new ListNode;
newNode->value = num;
p1->next = newNode;
p1 = p1->next;
cin >> num;
}
ListNode* ret1 = head1->next;
delete head1;
ListNode* head2 = new ListNode;
ListNode* p2 = head2;
cin >> num;
while (num != -1) {
ListNode* newNode = new ListNode;
newNode->value = num;
p2->next = newNode;
p2 = p2->next;
cin >> num;
}
ListNode* ret2 = head2->next;
delete head2;
// 合并两个链表
ListNode* ret = merge(ret1, ret2);
// 输出合并后的链表
if (!ret) {
cout << "NULL" << endl;
} else {
while (ret) {
cout << ret->value << " ";
ret = ret->next;
}
}
return 0;
}
```
代码中,我们首先读入两个链表,然后调用 merge 函数将两个链表合并。最后,我们输出合并后的链表。注意,如果新链表为空,我们需要输出 "NULL"。
阅读全文