//将两个非递减的有序链表合并为一个非递增的有序链表 #include#include 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; }



