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

  (2)特殊输入测试

    // 两个链表都只有一个数字
// list1: 1
// list2: 2
[TestMethod]
public void MergeTest3()
{
Node node1 = new Node();
Node node2 = new Node(); Node newHead = mergeHelper.Merge(node1, node2);
Assert.AreEqual(GetListString(newHead), "");
} // 两个链表中有一个空链表
// list1: 1->3->5
// list2: null
[TestMethod]
public void MergeTest4()
{
Node node1 = new Node();
Node node3 = new Node();
Node node5 = new Node(); node1.Next = node3;
node3.Next = node5; Node newHead = mergeHelper.Merge(node1, null);
Assert.AreEqual(GetListString(newHead), "");
} // 两个链表都是空链表
// 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: 分别用p1,p2两个指针扫描两个有序链表,p3指针去构建新链表h3. p1.val & ...

  2. 剑指Offer - 九度1519 - 合并两个排序的链表

    剑指Offer - 九度1519 - 合并两个排序的链表2013-11-30 22:04 题目描述: 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则.(hi ...

  3. 剑指offer十六之合并两个排序的链表

    一.题目 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 二.思路 注:链表1和链表2是两个递增排序的链表,合并这两个链表得到升序链表为链表3. 首先分析 ...

  4. 【剑指offer】面试题 25. 合并两个排序的链表

    面试题 25. 合并两个排序的链表 NowCoder 题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. Java 实现 ListNode Clas ...

  5. 【剑指Offer面试题】 九度OJ1518:反转链表

    与其非常快写出一段漏洞百出的代码,倒不如细致分析再写出鲁棒的代码. 提前想好測试用例(输入非空等等)进行測试改动代码. 题目链接地址: http://ac.jobdu.com/problem.php? ...

  6. C++版 - 剑指offer之面试题37:两个链表的第一个公共结点[LeetCode 160] 解题报告

    剑指offer之面试题37 两个链表的第一个公共结点 提交网址: http://www.nowcoder.com/practice/6ab1d9a29e88450685099d45c9e31e46?t ...

  7. 【Offer】[25] 【合并两个排序的链表】

    题目描述 思路分析 测试用例 Java代码 代码链接 题目描述 输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的.例如,输入图中的链表1和链表2,则合并之后的升序链表如链表3所 ...

  8. 16.合并两个排序的链表 Java

    题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 解题思路 两种解法:递归和非递归 参考代码 /* public class ListNode { ...

  9. 《剑指offer》面试题25. 合并两个排序的链表

    问题描述 输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的. 示例1: 输入:1->2->4, 1->3->4 输出:1->1->2-> ...

随机推荐

  1. make: *** [out/host/linux-x86/obj/EXECUTABLES/aidl_intermediates/aidl] 错误 1,make: *** [out/host/linux-x86/obj/lib/libESR_Portable.so] 错误 1

    错误3: g++: g++: selected multilib '32' not installed selected multilib '32' not installed make: *** [ ...

  2. PHPCMS_V9 模型字段添加单文件上传功能

    后台有“多文件上传”功能,但是对于有些情况,我们只需要上传一个文件,而使用多文件上传功能上传一个文件,而调用时调用一个文件URL太麻烦了. 使用说明: 1.打开phpcms\modules\conte ...

  3. 【java.lang.UnsupportedClassVersionError】版本不一致出错

    这种错误的全部报错信息: java.lang.UnsupportedClassVersionError: org/apache/lucene/store/Directory : Unsupported ...

  4. 解决安装mysql的”A Windows service with the name MySQL already exists.“问题

    如果以前安装过mysql,卸载重装,很可能会碰到"A Windows service with the name MySQL already exists."这样的提示.即服务已经 ...

  5. java的动态代理机制详解

    在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于Spring的核心AOP来说,我们不但要知道怎么通过AOP来满足的 ...

  6. 搜索技巧<转>

    平时工作,搜索引擎是少不了的,作为程序员,当然首推 Google.这里简单介绍下几个 Google 搜索的小技巧,方便别人也方便自己查阅. ps:以下所有操作,均可以在 「谷歌搜索首页 -> 设 ...

  7. C++-Qt【4】-CheckBox on QListView

    引用:http://www.qtcentre.org/threads/47119-checkbox-on-QListView QListWidgetItem *item = new QListWidg ...

  8. JSTL标签库

    JSP页面作为内嵌java的Html简化了Servlet在控制页面显示的语法,但JSP脚本中的表达式功能不够强大,语法也稍显繁杂,EL(Expression Language)表达式语言的出现能够大大 ...

  9. 【ORACLE】IN 后跟&参数字符串的处理方法

    今天写尼日利亚BOSS,数据修复脚本时遇到一个问题, 参数字符串无法再IN中使用,例如:想要完成下面的查询 select * From customeren c where c.customercod ...

  10. db2定界符

    在DB2数据库中,在导出DEL文件时,默认的字符分隔符是".字段分隔符是, (逗号).有一个需求是要为Oracle数据库提供数据,因此就想使用"|"作为数据的字段分隔符. ...