合并两个有序链表
题目:输入两个单调递增的链表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; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 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爆火,是硬核还是营销?