PS:这也是一道出镜率极高的面试题,我相信很多童鞋都会很眼熟,就像于千万人之中遇见不期而遇的人,没有别的话可说,唯有轻轻地问一声:“哦,原来你也在这里? ”

一、题目:合并两个排序的链表

题目:输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增排序的。例如输入下图中的链表1和链表2,则合并之后的升序链表如链表3所示。

  链表结点定义如下,使用C#描述:

    public class Node{public int Data { get; set; }// 指向后一个节点public Node Next { get; set; }public Node(int data){this.Data = data;}public Node(int data, Node next){this.Data = data;this.Next = next;}}

二、解题思路

  Step1.定义一个指向新链表的指针,暂且让它指向NULL;

  Step2.比较两个链表的头结点,让较小的头结点作为新链表的头结点;

  Step3.递归比较两个链表的其余节点,让较小的节点作为上一个新节点的后一个节点;

    public Node Merge(Node head1, Node head2){if (head1 == null){return head2;}else if (head2 == null){return head1;}Node newHead = null;if (head1.Data <= head2.Data){newHead = head1;newHead.Next = Merge(head1.Next, head2);}else{newHead = head2;newHead.Next = Merge(head1, head2.Next);}return newHead;}

三、单元测试

3.1 测试准备

  (1)借助MSUnit框架进行初始化与清理工作[TestInitialize]与[TestCleanup]

    private MergeHelper mergeHelper;[TestInitialize]public void Initialize(){// 实例化mergeHelper = new MergeHelper();}[TestCleanup]public void CleanUp(){// 不用TA了mergeHelper = null;} 

  (2)封装一个便于测试对比的辅助方法,将新链表生成一个字符串用于对比

    public string GetListString(Node head){if (head == null){return null;}StringBuilder sbList = new StringBuilder();while (head != null){sbList.Append(head.Data.ToString());head = head.Next;}return sbList.ToString();} 

3.2 测试用例

  (1)功能测试

    // list1: 1->3->5// list2: 2->4->6
    [TestMethod]public void MergeTest1(){Node node1 = new Node(1);Node node3 = new Node(3);Node node5 = new Node(5);node1.Next = node3;node3.Next = node5;Node node2 = new Node(2);Node node4 = new Node(4);Node node6 = new Node(6);node2.Next = node4;node4.Next = node6;Node newHead = mergeHelper.Merge(node1, node2);Assert.AreEqual(GetListString(newHead), "123456");}// 两个链表中有重复的数字// list1: 1->3->5// list2: 1->3->5
    [TestMethod]public void MergeTest2(){Node node1 = new Node(1);Node node3 = new Node(3);Node node5 = new Node(5);node1.Next = node3;node3.Next = node5;Node node2 = new Node(1);Node node4 = new Node(3);Node node6 = new Node(5);node2.Next = node4;node4.Next = node6;Node newHead = mergeHelper.Merge(node1, node2);Assert.AreEqual(GetListString(newHead), "113355");} 

  (2)特殊输入测试

    // 两个链表都只有一个数字// list1: 1// list2: 2
    [TestMethod]public void MergeTest3(){Node node1 = new Node(1);Node node2 = new Node(2);Node newHead = mergeHelper.Merge(node1, node2);Assert.AreEqual(GetListString(newHead), "12");}// 两个链表中有一个空链表// list1: 1->3->5// list2: null
    [TestMethod]public void MergeTest4(){Node node1 = new Node(1);Node node3 = new Node(3);Node node5 = new Node(5);node1.Next = node3;node3.Next = node5;Node newHead = mergeHelper.Merge(node1, null);Assert.AreEqual(GetListString(newHead), "135");}// 两个链表都是空链表// list1: null// list2: null
    [TestMethod]public void MergeTest5(){Node newHead = mergeHelper.Merge(null, null);Assert.AreEqual(GetListString(newHead), null);} 

3.3 测试结果

  (1)测试通过情况

  (2)代码覆盖率

作者:周旭龙

出处:http://edisonchou.cnblogs.com

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。

剑指Offer面试题:16.合并两个排序的链表相关推荐

  1. 剑指offer面试题[17]-合并两个排序的链表

    题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 常考题: 假设两个链表如下: 链表1:   1  ->  3 -> 5 -> ...

  2. 剑指offer面试题25. 合并两个排序的链表(双指针)

    题目描述 输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的. 思路 详见链接 代码 class Solution:def mergeTwolists(self, l1:List ...

  3. 剑指offer(C++)-JZ25:合并两个排序的链表(数据结构-链表)

    作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 题目描述: 输入两个递增的链表,单个链表的长度为n,合并这两个链表并使新链表中的节点仍然是递增排 ...

  4. 《剑指Offer》题目:合并两个排序的链表

    题目描述:输入两个单调递增的链表list1,list2,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 题目分析: 1.对于链表题目,首先考虑边界情况,即链表为空的情况,提升代码 ...

  5. 剑指offer——面试题37:两个链表的第一个公共结点

    剑指offer--面试题37:两个链表的第一个公共结点 20180906整理 Solution1: 时间复杂度为O(n2)O(n2)O(n^2)的垃圾算法 /* struct ListNode {in ...

  6. 【重点 递归版】剑指offer——面试题16:反转链表

    剑指offer--面试题16:反转链表 牛客网上有<剑指offer>的题目训练https://www.nowcoder.com/activity/oj 一个有关此题图文并茂的博客:http ...

  7. 剑指offer——面试题38:数字在排序数组中出现的次数

    剑指offer--面试题38:数字在排序数组中出现的次数 20180906整理 Solution1: [注意]先利用二分查找扎到一个值然后再顺序遍历的做法时间复杂度也是O(n)O(n)O(n),代码也 ...

  8. 剑指offer——面试题5:从尾到头打印链表

    剑指offer--面试题5:从尾到头打印链表 Solution1:我的答案 /** * struct ListNode { * int val; * struct ListNode *next; * ...

  9. 面试题25: 合并两个排序的链表

    /******************************************************************* *<剑指Offer--名企面试官精讲典型编程题>C ...

最新文章

  1. 3ds max 变形器使用
  2. ELK6.0已取消filebeat配置document_type
  3. 中文与Unicode码互转(utf-8)
  4. 后缀数组--(可重叠最长重复子串问题)
  5. VC中设置头文件的搜索路径~~
  6. JAVA中整数类型数据溢出问题研究
  7. u盘安装linux 7.4,U盘自动化安装CentOS7.4
  8. Python计算数组的n位全排列(permutations的使用)
  9. appium示例代码python_appium+Python 脚本编写
  10. 【Qt】x509证书操作之获取证书链并验证
  11. vue项目电商后台管理系统(一)
  12. 直面不确定性 看致远互联如何帮助组织自生长
  13. M个苹果放在N个盘子里,有多少种不同的放法
  14. DateTime.ToString()的用法
  15. 前后端交互必备之js数组方法大全
  16. 鸿蒙系统和小米系统区别,“鸿蒙系统”和“安卓系统”到底有什么区别?网友:细节定成败!...
  17. 版本管理:RCS之命令基础篇
  18. 【文学文娱】《有用无用论》
  19. Interview Vocabulary Summary
  20. selenium模拟登陆截取验证码

热门文章

  1. 机器学习 —— 极大似然估计与条件概率
  2. redis DB操作
  3. (四)2005年我的第一次软件行业创业,烧掉30万、2年时间打水漂的惨痛教训
  4. 【Vegas原创】Can't connect to X11 window server using ':0.0' 解决方法
  5. 【思维】Kenken Race
  6. 牛客练习赛24 C PH试纸
  7. 搬砖的也能学Python----if - elif 语句
  8. mysql 语句活用增删改
  9. 17-8-26-WebApp总结
  10. .Net Mvc Automated Migration 数据迁移