问题定义:

写一个函数Merge函数,该函数有两个参数,都是递增的链表,函数的功能就是合并这两个递增的链表为一个递增的链表,Merge的返回值是新的链表。新链表由前两个链表按元素递增顺序合并而成,也就是说它不会创建新的元素。

比如:这里有两个链表,分别是

list1: 5->10->15

list2: 2->3->20

Merge函数返回一个指向新链表的指针,新链表应该是如下这样的:2->3->5->10->15->20

程序需要考虑如下情况:两个链表(函数参数)都有可能为空,可能连个链表其中一个为空,可能两个链表相等,也可能其中一个链表已经遍历完了,另一个链表还有很多元素,所以需要首先处理特殊情况。

1、非递归实现

pLinkNode Merge(pList l1, pList l2)
{pList pNewHead = NULL;pLinkNode cur = NULL;assert(l1);assert(l2);if (l1 == l2)//链表相等{return l1;}if ((l1 == NULL) && (l2 != NULL))//L1为空{return l2;}if ((l1 != NULL) && (l2 == NULL))//l2为空{return l1;}if (l1->data < l2->data){pNewHead = l1;l1 = l1->next;pNewHead->next = NULL;}else{pNewHead = l2;l2 = l2->next;pNewHead->next = NULL;}cur = pNewHead;//确定头指针while ((l1) && (l2)){if (l1->data < l2->data){cur->next = l1;l1 = l1->next;}else{cur->next = l2;l2 = l2->next;}cur = cur->next;}if(l1==NULL){cur->next = l2;}else{cur->next= l1;}return pNewHead;
}

2、合并操作是非常适合用递归来完成的一类操作,递归实现将会比迭代实现更加清晰且易于理解。尽管如此,你可能也不愿意使用递归来实现这个操作,因为递归方法所使用的栈空间与链表的长度成正比。

思路:可以将两个有序单链表的合并简化为在两条单链表中一直寻找较小的头节点。但是首先还是要考虑特殊情况

pLinkNode _Merge(pList l1, pList l2)
{pList pNewHead = NULL;pLinkNode cur = NULL;assert(l1);assert(l2);if (l1 == l2)//链表相等{return l1;}if ((l1 == NULL) && (l2 != NULL))//L1为空{return l2;}if ((l1 != NULL) && (l2 == NULL))//l2为空{return l1;}if (l1->data < l2->data){pNewHead = l1;pNewHead->next = _Merge(l1->next, l2);}else{pNewHead = l2;pNewHead->next = _Merge(l1, l2->next);}return pNewHead;
}

转载于:https://blog.51cto.com/10788311/1746893

C语言常见单链表面试题(2)相关推荐

  1. C语言实现单链表面试题汇总

    这篇博客只有针对单链表的不同面试题的不同函数,没有对单链表的具体实现方法的介绍. 单链表的具体实现方法(创建,初始化,前插,后插,删除,插入,销毁等),可以参考我的另一边博客: http://blog ...

  2. c语言字符串操作面试题,C语言常见字符串面试题.pdf

    C语言常见字符串面试题 1. 字符串库函数的内部实现 memset库函数的实现 /* * memset - Fill a region of memory with the given value * ...

  3. 嵌入式-C语言常见面试/笔试题

    [1]关键字类型题 常见的关键字有 sizeof.static.const.volatile 1.sizeof:通常与strlen做比较不同 例1:char str[] = "Hello&q ...

  4. 数据结构:单链表(水浒传英雄操作为例)+单链表面试题

    目录 用单链表来实现简单的增删改 面试题 求单链表中有效节点个数 查找单链表中的倒数第k个节点 单链表的反转(有点难度) 从尾到头(逆序)打印单链表[要求方式1.反向遍历 2.Stack栈] 合并两个 ...

  5. c/c++单链表面试题—链表带环问题

    1.判断一个单链表是否带环 思路解析: 判断一个单链表是不是带环,就看在遍历单链表的时候能不能遍历完成,如果带环的话会陷入死循环程序一直无法结束,但是这种判断方法在程序的实现是不可能的.所以转换一种思 ...

  6. C语言一般考点笔试,c语言常见笔试题及答案

    c语言常见笔试题及答案 c语言常见笔试题总结c语言笔试题(九) 2006-09-06 Tag: C语言 1. #include "stdio.h" int main() {int ...

  7. c语言中void f1(),c语言常见笔试题f1ryiedy.doc

    c语言常见笔试题f1ryiedy c语言常见笔试题总结 [1 使用宏] 1.1 #ifdef NDEBUG #define TRACE(S) S #else #define TRACE(S) prin ...

  8. 2020年 Java 最常见200+ 面试题全解析:面试必备

    Java 最常见200+ 面试题全解析:面试必备 如想了解更多更全面的Java必备内容可以阅读:所有JAVA必备知识点面试题文章目录: JAVA必备知识点面试题 序 言 在本篇文章开始之前,我想先来回 ...

  9. 「面试必备」常见Java面试题大综合 马云见了都点赞

    一.Java基础 1.Arrays.sort实现原理和Collections.sort实现原理 答:Collections.sort方法底层会调用Arrays.sort方法,底层实现都是TimeSor ...

最新文章

  1. 用STL给C++充电:第一部分
  2. 计算机发展初期 承载信息的媒体,《多媒体技术与应用》(本)阶段练习一
  3. 【LeetCode】LRU Cache 解决报告
  4. 太原理工与长安大学计算机,被严重低估的几所211大学,这所大学排名绝对靠前,同城竞争太大...
  5. springboot封装统一查询对象进行多条件查询案例(mybatis和mybatis-plus+反射两种版本)
  6. 技术开发(委托)合同怎么写?
  7. 软件工程敏捷开发01
  8. java图片特效轮播代码_JQuery实现图片轮播效果
  9. 9个心理学研究,让你学习更高效
  10. Failed to meta-introspect annotation interface org.springframework.web.bind.annotation.RequestBody:
  11. centos最新版solr5.3.1安装和数据整理以及遇到的问题解答
  12. 优先经验回放(Prioritized Experience Replay)
  13. Xenserver 为XenCenter添加本地磁盘
  14. discuz怎么自定义php,Discuz添加自定义数据调用模块
  15. [SSL_CHX][2022-1-28]n皇后问题
  16. Esp32-C3使用gpio唤醒深度睡眠,rtc gpio0~5始终置低,导致低电平唤醒一直复位,高电平唤醒无效?
  17. OpenSSL SSL_read: Connection was aborted, , errno 10053
  18. 最好的Vue组件库之Vuetify的入坑指南(持续更新中)
  19. 勾股定理用计算机怎用,勾股定理公式计算器
  20. CSS - Flexbox总结

热门文章

  1. 初探GNN-文本表示学习
  2. energy计算机电脑,energy management
  3. 暖通lisp快捷键_CAD 快捷键一览
  4. java与C++实现判断闰年(百练OJ:2733:判断闰年)
  5. 百练OJ:3865和2677:肿瘤检测
  6. 信息系统项目管理师:第6章:项目进度管理-章节真题
  7. 30个Python常用极简代码
  8. Vue中使用can-autoplay插件实现浏览器不支持自动播放音频时提示点击
  9. Django 出现 “multiple primary key defined”报错
  10. 专家解读:《个保法》下,企业在商业营销中有哪些红线绝不可触碰?