zoukankan      html  css  js  c++  java
  • 合并两个有序链表

    题目:输入两个单调递增的链表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;
    }
  • 相关阅读:
    Java入门——day28
    第四周进度报告
    Java入门——day27
    Java入门——day26
    Java入门——day25
    Java入门——day24
    Ubuntu创建新用户
    SpringBoot默认的Servlet容器是自带的Tomcat,如何定制和修改配置
    哈希
    找到两张相似的图
  • 原文地址:https://www.cnblogs.com/GuoYuying/p/11465465.html
Copyright © 2011-2022 走看看