题目:输入两个单调递增的链表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; }