有序的合并两个有序链表

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

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

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




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值