合并两个排序的链表

题目:

输入两个递增序列的链表, 合并这两个链表使新链表中的序列仍是递增的。

结点结构定义:

typedef struct Node
{
    int val_;
    struct Node *next;
}Node;

思路:

定义链表1, 链表2,  可以将链表1作为主体链表(即将链表2中的结点依次插入链表1中)

对链表1定义两个指针, 初始值为pPre1 = NULL,   pCur1 = pHead1;

对链表2定义两个指针,初始值为pPre2  = NULL, pCur2 = pHead2;

判断:  ①当pCur1->val_ 小于pCur2->val_时,   pPre1 = pCur1, pCur1 = pCur1->next(即pPre1与pCur1一直往后移),直到pCur1->val_>=pCur2->val_停止,此时

              pPre1->val_     <     pCur1->val_    且   pCur1->val_     >=   pCur2->val_ ,先不管这俩指针, 一会会将链表2的部分数据插入到这俩指针之间

             ②pCur2->val_肯定是小于等于pCur2->val_的,即它肯定要插入pPre1与pCur1之间, 将pCur2作标记   pBegin2 = pCur2;  接着pPre2与pCur2一直往后移,直到

              pCur2->val_     >    pCur1->val 停止。

             ③ 最终会将pBegin2与pPre2之间的数据 插入到pPre1与pCur1之间

代码:

Node *Merge(Node *pHead1, Node *pHead2)
{
        if (!pHead1 && !pHead2)
            return NULL;
        if (!pHead1 && pHead2)  //链表2与空链表合并
            return pHead2;
        if (pHead1 && !pHead2)
            return pHead1;
        Node *pRet = pHead1;    //合并后的链表头结点, 默认为链表1的头结点
        Node *pPre1 = NULL;
        Node *pCur1 = pHead1;
        Node *pPre2 = NULL;
        Node *pCur2 = pHead2;
        while (pCur1 && pCur2)
        {
            if (pCur1->val_ < pCur2->val_)   //pPre1与pCur1后移, 直到pCur1->val_     >     pCur1->val_
            {
                 pPre1 = pCur1;
                 pCur1 = pCur1->next;
                 continue;
            }
            Node *pBegin2 = pCur2;  //作标记
            while (pCur2 && pCur2->val_ <= pCur1->val_) // 查找 大于pPre1小于等于  pCur1之间的数据
            {
                pPre2 = pCur2;
                pCur2 = pCur2->next;
            }

            //   pPre1    pCur1    pBegin2   pPre2都已经找到,开始插入

            pPre2->next = pCur1;  
            if (pPre1)
            {
                pPre1->next = pBegin2;
            }else    //  这种情况是刚开始pCur1指向的值   大于    pCur2的值,   此时要将pBegin2与pPre2之间的数据插入到pCur1之前, 且合并后头结点指针为pBegin2
            {
                pRet = pBegin2;
                pPre1 = pCur1;
            }
        
    }
    if (!pCur1 && pCur2) //  有可能链表1已经结束,但是链表2依然有值, 此时只要将pPre1->next = pCur2即可
    {
        pPre1->next = pCur2;
    }
    return pRet;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值