题目描述
假定两个单链表是递增有序,定义并实现以下函数,完成两个单链表的合并,继续保持递增有序
int LL_merge(ListNode *La, ListNode *Lb)
输入
第1行先输入n表示有n个数据,接着输入n个数据
第2行先输入m表示有M个数据,接着输入m个数据
输出
输出合并后的单链表数据,数据之间用空格隔开
#include <iostream>
using namespace std;
class LNode{
int data;
LNode *next;
LNode(){next=NULL;}
friend class LinkList;
};
class LinkList{
LNode *head;
int len;
public:
LinkList();
~LinkList();
void CreateInTail(int n);
void outPut();
LinkList merge(LinkList &li);
};
LinkList::LinkList() {
head = new LNode;
}
LinkList::~LinkList() {
LNode *p = head,*q;
while (p)
{
q=p;
p=p->next;
delete q;
}
len=0;
head = NULL;
}
void LinkList::CreateInTail(int n) {
len = n;
LNode *tail=head;//尾插法
while (n--)
{
int item;
cin>>item;
LNode *s =new LNode;
s->data=item;
tail->next=s;
tail=s;
}
}
void LinkList::outPut() {
LNode *p=head->next;//不是头节点,是头节点的下一个结点
while (p)
{
cout<<p->data<<' ';
p=p->next;
}
cout<<endl;
}
LinkList LinkList::merge(LinkList &li) {
LinkList temp;
temp.len = len+li.len;
LNode *p=head->next,*q=li.head->next,*r=temp.head;
while (p && q)
{
LNode *s=new LNode;
if(p->data<q->data) {
s->data = p->data;
p=p->next;
}
else {
s->data = q->data;
q=q->next;
}
r->next = s;
r=r->next;
}
while (p){//当q已经被排完成之后
LNode *s=new LNode;
s->data=p->data;
r->next = s;
r=r->next;
p=p->next;
/*说实话,这里我不是很明白,先之前说的尾插法这里
如果是s和p
node *p=head;
node *s;
s->data=item;
p->next=s;
p=s;
它这里就是将这个数字自动向后移动了,将原先的p(i-1)变成了pi
而这里
s->data=p->data;//r是一个链表的头结点,p为含有数字的结点,而s为新建的结点,用于储存数据的那个结点;
r->next=s;
r=r->next;
p=p->next;//这个我理解,但是前面那个r=r->next;这样不会把它的前面的结点给搞没了嘛?
}
while (q){
LNode *s=new LNode;
s->data=q->data;
r->next = s;
r=r->next;
q=q->next;
}
return temp;
}
int main()
{
int n,m;
cin>>n;
LinkList firstList;
firstList.CreateInTail(n);
cin>>m;
LinkList secondList;
secondList.CreateInTail(m);
LinkList thirdList=firstList.merge(secondList);
thirdList.outPut();
return 0;
}