//链表合并
#include<iostream>
#include<cstdlib>
using namespace std;
typedef struct lNode
{
int data;
struct lNode *next;
} *linkList;
//尾插法建立单链表
lNode* finCreatList(linkList &L, int n)//n代表建立链表的节点个数
{
//初始化头结点
L = (lNode*)malloc(sizeof(lNode));
L->next = NULL;
//s为新插入节点,r为尾节点
lNode *s,*r;
r = L;//r始终指向链表尾节点
while(n--)
{
int x; //x为新插入节点的指针域
cin >> x;
s = (lNode*)malloc(sizeof(lNode));
s->data = x;
//节点插入
r->next = s;
r = s;
}
r->next = NULL; //最后尾指针置为空
return L;
}
//链表输出
void outputLinkList(linkList L)
{
lNode *p = L->next;
while(p != NULL)
{
if(p->next != NULL)
cout << p->data << " ";
else
cout << p->data;
p = p->next;
}
}
//合并链表
lNode* mergelist(linkList &L1,linkList &L2,linkList &L)
{
lNode *p1,*p2;
p1 = L1->next;
p2 = L2->next;
//借助另一个链表实现
//为什么让L指向链表L2(指向L1也一样)因为要给L开辟一个空间,否则会召造成内存溢出
//L = L2;
lNode *p3 = L; //p3始终指向L表中的尾节点;
while(p1 && p2)
{
if(p1->data <= p2->data)
{
p3->next = p1;
p3 = p1; //更新p3指向L中新的尾节点
p1 = p1->next;
}
else
{
p3->next = p2;
p3 = p2;
p2 = p2->next;
}
}
//p1不为空就指向p1,p2不为空就指向p2,指向还未遍历完的那个
p3->next = p1 ? p1 : p2;
return L;
}
int main()
{
linkList L1, L2;
int n1, n2; //链表1 2的长度
cin >> n1;
finCreatList(L1, n1);
cin >> n2;
finCreatList(L2, n2);
/*L开辟空间,如果不开辟空间,
后续使用会造成溢出也可以在mergelist()中以L = L1 或L = l2开辟空间*/
linkList L;
L = (lNode*)malloc(sizeof(lNode));//相当于mergelist()中L = L1 或L = l2
mergelist(L1,L2,L);
outputLinkList(L);
return 0;
}