6-9 两个非递减的有序链表合并 - 人邮DS(C 第2版)线性表习题2(2)
作者 汪凌锋
单位 成都信息工程大学
将两个非递减的有序链表合并为一个非递减的有序链表。要求结果链表仍使用原来两个链表的存储空间, 不另外占用其它的存储空间。表中允许有重复的数据。链表合并后清空原链表。
函数接口定义:
void MergeList(LinkList const &la, LinkList const &lb, LinkList const &lc);
参数定义:
la - 被合并的链表一
lb - 被合并的链表二
lc - 合并后的新链表
裁判测试程序样例:
// Copyright [2023] <Water Wang>
#include <iostream>
enum Status {
OK = 0, ERROR = -1, OVER_FLOW = -2
};
typedef struct LNode {
int data;
struct LNode *next;
} LNode, *LinkList; // LinkList is the pointer type which point to struct LNode
void InputDataAsLinkList(LinkList const &link_list);
void OutputDataInLinkList(LinkList const &link_list);
Status InitList(LinkList * link_list);
Status DestroyList(LinkList * link_list);
void MergeList(LinkList const &la, LinkList const &lb, LinkList const &lc);
int main() {
LinkList la, lb, lc;
InitList(&la);
InitList(&lb);
InitList(&lc);
InputDataAsLinkList(la);
InputDataAsLinkList(lb);
MergeList(la, lb, lc);
OutputDataInLinkList(la);
OutputDataInLinkList(lb);
OutputDataInLinkList(lc);
DestroyList(&la);
DestroyList(&lb);
DestroyList(&lc);
return 0;
}
/// @brief accept data from console, and store data in link list.
/// @param link_list link list which stores input data from console.
void InputDataAsLinkList(LinkList const &link_list) {
using std::cin;
cin >> link_list->data;
LinkList temp_link_list = link_list;
for (int i = 0; i < link_list->data; i++) {
LNode * temp_lnode_ptr = new LNode;
temp_lnode_ptr->next = NULL;
cin >> temp_lnode_ptr->data;
temp_link_list->next = temp_lnode_ptr;
temp_link_list = temp_link_list->next;
}
return;
}
/// @brief output data in link list to console
/// @param link_list link list which stores all input data from console.
void OutputDataInLinkList(LinkList const &link_list) {
using std::cout;
using std::endl;
LinkList temp_link_list = link_list->next;
cout << link_list->data << endl;
while (NULL != temp_link_list) {
if (NULL != temp_link_list->next) {
cout << temp_link_list->data << " ";
} else {
cout << temp_link_list->data << endl;
}
temp_link_list = temp_link_list->next;
}
return;
}
/// @brief initiate link list.
/// @param link_list link list to be initiated.
Status InitList(LinkList *link_list) {
Status result = ERROR;
*link_list = new LNode;
(*link_list)->data = 0;
(*link_list)->next = NULL;
result = OK;
return result;
}
/// @brief destroy link list.
/// @param link_list link list to be destroyed.
Status DestroyList(LinkList * link_list) {
while (NULL != (*link_list)) {
LNode *p = *link_list;
*link_list = (*link_list)->next;
delete p;
}
return OK;
}
/// @brief merge two none decremental link lists as one none decremental link list.
/// clear the field data and next in link list head.
/// @param la 1st none decremental link list to be merged.
/// @param lb 2nd none decremental link list to be merged.
/// @param lc new none decremental link list.
/* 请在这里填写答案 */
输入样例:
输入两组长度不超过10的数组,每一组的第一行输入数组长度,第二行输入递增数组。例如:
5
20 50 60 90 150
7
2 30 60 60 80 160 180
输出样例:
输出链表合并后的两个空链表和新链表的长度及链表的各元素值,链表为空仅输出长度0。例如:
0
0
12
2 20 30 50 60 60 60 80 90 150 160 180
接口函数定义:
void MergeList(LinkList const &la, LinkList const &lb, LinkList const &lc) {
LinkList pa = la->next;
LinkList pb = lb->next;
LinkList pc = lc;
while (pa && pb) {
if (pa->data <= pb->data) {
pc->next = pa;
pc = pa;
pa = pa->next;
} else {
pc->next = pb;
pc = pb;
pb = pb->next;
}
}
pc->next = pa ? pa : pb;
la->next = NULL;
lb->next = NULL;
la->data = 0;
lb->data = 0;
int cnt = 0;
pc = lc->next;
while (pc) {
++cnt;
pc = pc->next;
}
lc->data = cnt;
}