有序的合并两个有序链表

来源:互联网 发布:淘宝隐藏优惠券app 编辑:程序博客网 时间:2024/05/08 00:52

输入两个递增链表,合并这两个链表中的元素,并保证合并后的链表中的节点仍然是递增排序的。

首先定义一个节点的结构体:

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;    }
运行结果: