//将两个非递减的有序链表合并为一个非递增的有序链表
#include<iostream>
#include<stdlib.h>
using namespace std;
typedef struct Lnode { //定义链表
int data;
struct Lnode* next;
}link;
Lnode* Init_List(int n) { //初始化链表,确定长度,输入数据
Lnode* p = 0, * q = 0;
cout << "输入数据" << endl;
for (int i = 1; i <= n; i++) {
Lnode* New_node = (Lnode*)malloc(sizeof(Lnode)); //动态分配内存
cin >> New_node->data; //填充数据
New_node->next = NULL; //最后一个节点指针NULL
if (i == 1) {
q = New_node; //给q,p赋值第一个结点
p = New_node;
}
else { //形成一条p链
p->next = New_node; //p陆续指向后边的结点
p = p->next; //p移动到最后
}
}
return q;
}
Lnode* Merge_List(Lnode* La, Lnode* Lb) { //合并两条传入的链表
Lnode* pc=0, * pa=0, * pb=0; //这里p中转,o指向最后一个元素,q指向最新元素
int i = 1; //第一次合并使用
while (La || Lb) {
if (!La) { //a空了,直接指向b的结点
cout << Lb->data;
pa = Lb;
Lb = Lb->next;
} //b空了或者a的数据<=b的数据时,指向a的结点
else if (!Lb || La->data <= Lb->data) {
cout << La->data;
pa = La;
La = La->next;
} //此处可和上面的合并
else {
cout << Lb->data;
pa = Lb;
Lb = Lb->next;
}
if (i == 1) {
pc = pb = pa; //初始化指针
i++; //使用一次舍弃
}
else {
pa->next = pb; //使取下的结点连上合并后的链
pb = pa; //更新q的位置到最新结点
}
}
pc->next = NULL; //使最后一个指向NULL输出结束条件
free(Lb); //a,b,q的空间可以释放
free(La);
return pb;
}
int main() {
int m, n; //记录a,b的长度
cout << "第一个链表的长度:" << endl;
cin >> m;
Lnode* a = Init_List(m); //初始化a
cout << "第二个链表的长度" << endl;
cin >> n;
Lnode* b = Init_List(n); //初始化b
Lnode* c = Merge_List(a, b);//合并a,b
cout << "合并之后的链表:" << endl;
while (c) {
cout << c->data << " ";
c = c->next;
}
return 0;
}
C++实现将两个非递增的有序链表合并为一个非递减的有序链表不改变原来的存储空间,允许有重复元素出现
最新推荐文章于 2023-05-20 22:14:47 发布