合并两个有序链表

题目:输入两个单调递增的链表pHead1和pHead2,输出两个链表合成后的链表,需要合成后的链表满足单调不减规则

方法一:非递归合并

  两个指针分别从链表头开始,以其中一个链表为基准链,将另一个链表结点不断插入到基准链的适当结点之前。

  这里以 p = pHead1, q = pHead2; 并且以 pHead1链表为基准链,将pHead2结点插入到pHead1。

判断过程可以简写为:

if q->data < p->data  // p指向基准链结点

   将 q所指结点插入到 p所指结点之前

else  // 将 基准链中 p 指向下一个结点,继续执行上述判断

  移动指针 p 

完整代码

复制代码
ElemSN *Merge(ElemSN *pHead1, ElemSN *pHead2)
{
    ElemSN *p = pHead1, *pf = NULL;
    ElemSN *q = pHead2;
    while( p && q){ 
        if(q->data < p->data){
            ElemSN *m = q;
            q = q->next;
            if(!pf){  // p == pHead1 ,头插
                     m->next = pHead1;
                      pHead1 = pf = m;
            }else{ //中间(尾)插
                     m->next = pf->next;
                     pf = pf->next = m;
            }    
        }else{ 
             pf = p;
             p = p->next; 
        }
    }
    if(q){
        if(!pf){  // pHead1为空链表
            pHead1 = q;  //      
        }else{
            pf->next = q;
        }
    }
    return pHead1;        
}
复制代码

方法二:递归合并

  递归合并有点像压栈的过程。具体方法是创建一个指针ListAll,用来指向最终返回的合并后的新链表的头结点。每次依旧是比较两个链上的结点,将较小的赋值给ListAll,再用较小节点的下一个结点进行比较,将得到的较小结点赋值给ListAll->next,依次类推,最终函数逐级返回后得到的ListAll就指向所求链表的头结点。

完整代码

复制代码
ElemSN *Merge(ElemSN *pHead1, ElemSN *pHead2)
{
    if(!pHead1){
        return pHead2;
    }else if(!pHead2){
        return pHead1;
    }
    ElemSN *ListAll;
    if(pHead1->data < pHead2->data){
        ListAll = pHead1;  // 将较小结点赋值给ListAll
        ListAll->next = Merge(pHead1->next, pHead2); // 使用较小结点的下一个结点继续 与 pHead2比较
    }else{
        ListAll = pHead2;
        ListAll = Merge(pHead2->next, pHead1);
    }
    return ListAll;
}
复制代码

 

posted @   _程序兔  阅读(461)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?
点击右上角即可分享
微信分享提示