实现C++链表的创建、删除、排序、合并(保持单调不减)
题目:创建链表、对链表进行排序、合并两个排序的链表(保持单调不减)
合并思路:
方法1:如果将两链表头尾相接后再整体排序,复杂度太高。因此可以利用链表已经排好序的特点进行逐步合并。用两个指针p1、p2指向两链表头结点head1、head2,并比较,显然,值小的为合并链表的头结点head,假如p1值较小,p1=head, p1后移,再与p2比较,值小的并入合并链表,并且指针加1,依次类推,直到某一个链表为空后,可以直接将另一链表的剩余元素一起并入合并链表。注意对空链表的处理。
方法2:如果将每一次的p1、p2都使视作两个链表的头结点,便可以用递归来实现。
完整代码:
#include<iostream>
using namespace std;
struct ListNode
{
int value;
ListNode* next;
};
ListNode *BuildList()//链表创建,分配内存
{
cout<<"输入一个链表(-1结束):"<<endl;
int n;
ListNode* head=NULL;
ListNode* q=NULL;
ListNode* p=NULL;
cin>>n;
while(n!=-1)
{
q=new ListNode;
q->value=n;
if(head==NULL)
head=q;
else
p->next=q;
p=q;
cin>>n;
}
if(head==NULL)
return 0;
p->next=NULL;
return head;
}
void DeleteList(ListNode* pHead)//链表删除,释放内存
{
ListNode* delete_r=NULL;
while(pHead!=NULL)
{
delete_r=pHead;
pHead=pHead->next;
delete delete_r;
}
}
ListNode* Sort(ListNode* pHead)//链表排序
{
ListNode* p=NULL;
ListNode* q=NULL;
int temp;
for(p=pHead;p!=NULL;p=p->next)
{
for(q=p->next;q!=NULL;q=q->next)
{
if(p->value>q->value)
{
temp=p->value;
p->value=q->value;
q->value=temp;
}
}
}
return pHead;
}
ListNode* Merge(ListNode* pHead1, ListNode* pHead2)//方法1:非递归
{
ListNode* p1=pHead1;
ListNode* p2=pHead2;
ListNode* p=NULL;
ListNode* pHead=NULL;
if(pHead1==NULL)//有一个链表为空,可以直接返回另一个链表
return pHead2;
if(pHead2==NULL)
return pHead1;
if(pHead1->value<=pHead2->value)//头结点值小的为合并链表头结点
{
pHead=pHead1;
p1=p1->next;
}
else
{
pHead=pHead2;
p2=p2->next;
}
p=pHead;
while(p1!=NULL && p2!=NULL)//逐步合并
{
if(p1->value <= p2->value)//值小的加入合并链表,指针后移
{
p->next=p1;
p1=p1->next;
}
else
{
p->next=p2;
p2=p2->next;
}
p=p->next;
}
if(p1==NULL)//有一个链表为空时,另一个链表剩余部分全部并入合并链表
p->next=p2;
else
p->next=p1;
return pHead;
}
ListNode* Merge(ListNode* pHead1, ListNode* pHead2)//方法2:递归
{
ListNode* pHead;
if(pHead1==NULL)
return pHead2;
if(pHead2==NULL)
return pHead1;
if(pHead1->value<=pHead2->value)
{
pHead=pHead1;
pHead1=pHead1->next;
}
else
{
pHead=pHead2;
pHead2=pHead2->next;
}
pHead->next=Merge(pHead1,pHead2);
return pHead;
}
int main()//主程序
{
ListNode* head1=NULL;
ListNode* head2=NULL;
ListNode* p=NULL;
head1=BuildList();
head2=BuildList();
Sort(head1);
Sort(head2);
head1=Merge(head1,head2);
p=head1;
while(p!=NULL)
{
cout<<p->value<<" ";
p=p->next;
}
cout<<endl;
DeleteList(head1);
return 0;
}