输入两个递增链表,合并这两个链表中的元素,并保证合并后的链表中的节点仍然是递增排序的。
首先定义一个节点的结构体:
struct node
{
int n_val;
node *next;
};
其次实现递增单链表的输入:即输入一系列递增的数字,并使它们形成一个链表。知道遇到”-1“,停止输入。
void create_list(node * &rhead)
{
node *pcur_node = NULL;
node *ptemp_node = NULL;
bool ishead= true;
while(1)
{
if(ishead)
{
rhead = new node;
cin>>rhead->n_val;
if(-1 == rhead->n_val)
{
delete rhead;
rhead =NULL;
break;
}
else
{
rhead->next = NULL;
ishead = false;
pcur_node = rhead;
}
}
else
{
ptemp_node = new node;
cin>>ptemp_node->n_val;
if(-1 == ptemp_node->n_val)
{
delete ptemp_node;
ptemp_node = NULL;
break;
}
else
{
ptemp_node->next = NULL;
pcur_node->next = ptemp_node;
pcur_node = ptemp_node;
}
}
}
}
合并两个链表:这里用到3个辅助指针,分别是list1的当前指针,list2的当前指针,以及合并后的list的当前指针。
node* merge_list(node* rhead1, node *rhead2)
{
if(NULL == rhead1)
return rhead2;
if(NULL == rhead2)
return rhead1;
node * cur_list1 = rhead1;
node * cur_list2 = rhead2;
node *head = NULL;
if(cur_list1->n_val > cur_list2->n_val )
{
head = cur_list2;
cur_list2 = cur_list2->next;
}
else
{
head = cur_list1;
cur_list1 = cur_list1->next;
}
node *temp = head;
while(NULL != cur_list1 && NULL!=cur_list2)
{
if(cur_list1->n_val > cur_list2->n_val )
{
temp->next = cur_list2;
temp = cur_list2;
cur_list2 = cur_list2->next;
}
else
{
temp->next = cur_list1;
temp = cur_list1;
cur_list1 = cur_list1->next;
}
}
while(cur_list1 != NULL)
{
temp ->next = cur_list1;
temp = cur_list1;
cur_list1 = cur_list1->next;
}
while(cur_list2 != NULL)
{
temp ->next = cur_list2;
temp = cur_list2;
cur_list2 = cur_list2->next;
}
temp->next = NULL;
return head;
}
除了上面的函数外还需要定义链表的显示函数以及程序结束后对new的内存空间的delete的函数。
void display_list(node *phead)
{
if(NULL == phead)
return;
node *cur = phead;
while(NULL != cur)
{
cout<<cur->n_val<<" ";
cur = cur->next;
}
cout<<endl;
}
void delete_list(node *&rhead)
{
node *cur = rhead;
while(NULL != cur)
{
node *temp = cur->next;
delete cur;
cur = temp;
}
cout<<endl;
delete rhead;
rhead = NULL;
}
下面是main()函数
int main()
{
node *head1;
create_list(head1);
display_list(head1);
node *head2;
create_list(head2);
display_list(head2);
node *head = merge_list(head1, head2);
display_list(head);
delete_list(head);
return 0;
}
运行结果: