合并两个有序链表

题目:输入两个单调递增的链表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 @ 2019-09-05 13:44  _程序兔  阅读(455)  评论(0编辑  收藏  举报