用一个c++程序解决以下两个1)实现链表的排序(升序) 2)实现两个有序链表的合并:A=AUB,要求合并后仍然有序。 提交前请将所有的提示信息去掉,只保留最后的输出结果。例如运行时:从键盘直接输入: 212 3123 输出结果为: 1 2 3 分别表示第一个链表元素个数为2,元素分别为1.2;第二个链表元素个数为3,元素分别为1.2,3.
时间: 2024-02-25 11:54:39 浏览: 114
好的,以下是C++程序的实现:
```cpp
#include <iostream>
using namespace std;
struct ListNode {
int val;
ListNode* next;
ListNode(int x) : val(x), next(NULL) {}
};
// 对链表进行排序
ListNode* sortList(ListNode* head) {
if (head == NULL || head->next == NULL) {
return head;
}
ListNode* slow = head;
ListNode* fast = head->next;
while (fast != NULL && fast->next != NULL) {
slow = slow->next;
fast = fast->next->next;
}
ListNode* mid = slow->next;
slow->next = NULL;
ListNode* left = sortList(head);
ListNode* right = sortList(mid);
ListNode* dummy = new ListNode(0);
ListNode* cur = dummy;
while (left != NULL && right != NULL) {
if (left->val < right->val) {
cur->next = left;
left = left->next;
} else {
cur->next = right;
right = right->next;
}
cur = cur->next;
}
cur->next = (left != NULL) ? left : right;
return dummy->next;
}
// 合并两个有序链表
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
ListNode* dummy = new ListNode(0);
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;
}
cur->next = (l1 != NULL) ? l1 : l2;
return dummy->next;
}
int main() {
int n1, n2, val;
ListNode* head1 = new ListNode(0);
ListNode* cur1 = head1;
ListNode* head2 = new ListNode(0);
ListNode* cur2 = head2;
cin >> n1;
for (int i = 0; i < n1; i++) {
cin >> val;
cur1->next = new ListNode(val);
cur1 = cur1->next;
}
cin >> n2;
for (int i = 0; i < n2; i++) {
cin >> val;
cur2->next = new ListNode(val);
cur2 = cur2->next;
}
ListNode* sorted1 = sortList(head1->next);
ListNode* sorted2 = sortList(head2->next);
ListNode* merged = mergeTwoLists(sorted1, sorted2);
while (merged != NULL) {
cout << merged->val << " ";
merged = merged->next;
}
return 0;
}
```
输入格式为:
```
n1 val1 val2 ... valn1
n2 val1 val2 ... valn2
```
其中,n1 表示第一个链表的元素个数,val1, val2, ..., valn1 表示第一个链表的元素;n2 表示第二个链表的元素个数,val1, val2, ..., valn2 表示第二个链表的元素。输出结果为合并后的有序链表元素。例如运行时:
```
输入:
2 1 2
3 1 2 3
输出:
1 1 2 2 3
```
表示第一个链表元素个数为2,元素分别为1, 2;第二个链表元素个数为3,元素分别为1, 2, 3;合并后的有序链表元素为1, 1, 2, 2, 3。
阅读全文