剑指Offer面试题:16.合并两个排序的链表
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.合并两个排序的链表相关推荐
- 剑指offer面试题[17]-合并两个排序的链表
题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 常考题: 假设两个链表如下: 链表1: 1 -> 3 -> 5 -> ...
- 剑指offer面试题25. 合并两个排序的链表(双指针)
题目描述 输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的. 思路 详见链接 代码 class Solution:def mergeTwolists(self, l1:List ...
- 剑指offer(C++)-JZ25:合并两个排序的链表(数据结构-链表)
作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 题目描述: 输入两个递增的链表,单个链表的长度为n,合并这两个链表并使新链表中的节点仍然是递增排 ...
- 《剑指Offer》题目:合并两个排序的链表
题目描述:输入两个单调递增的链表list1,list2,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 题目分析: 1.对于链表题目,首先考虑边界情况,即链表为空的情况,提升代码 ...
- 剑指offer——面试题37:两个链表的第一个公共结点
剑指offer--面试题37:两个链表的第一个公共结点 20180906整理 Solution1: 时间复杂度为O(n2)O(n2)O(n^2)的垃圾算法 /* struct ListNode {in ...
- 【重点 递归版】剑指offer——面试题16:反转链表
剑指offer--面试题16:反转链表 牛客网上有<剑指offer>的题目训练https://www.nowcoder.com/activity/oj 一个有关此题图文并茂的博客:http ...
- 剑指offer——面试题38:数字在排序数组中出现的次数
剑指offer--面试题38:数字在排序数组中出现的次数 20180906整理 Solution1: [注意]先利用二分查找扎到一个值然后再顺序遍历的做法时间复杂度也是O(n)O(n)O(n),代码也 ...
- 剑指offer——面试题5:从尾到头打印链表
剑指offer--面试题5:从尾到头打印链表 Solution1:我的答案 /** * struct ListNode { * int val; * struct ListNode *next; * ...
- 面试题25: 合并两个排序的链表
/******************************************************************* *<剑指Offer--名企面试官精讲典型编程题>C ...
最新文章
- 3ds max 变形器使用
- ELK6.0已取消filebeat配置document_type
- 中文与Unicode码互转(utf-8)
- 后缀数组--(可重叠最长重复子串问题)
- VC中设置头文件的搜索路径~~
- JAVA中整数类型数据溢出问题研究
- u盘安装linux 7.4,U盘自动化安装CentOS7.4
- Python计算数组的n位全排列(permutations的使用)
- appium示例代码python_appium+Python 脚本编写
- 【Qt】x509证书操作之获取证书链并验证
- vue项目电商后台管理系统(一)
- 直面不确定性 看致远互联如何帮助组织自生长
- M个苹果放在N个盘子里,有多少种不同的放法
- DateTime.ToString()的用法
- 前后端交互必备之js数组方法大全
- 鸿蒙系统和小米系统区别,“鸿蒙系统”和“安卓系统”到底有什么区别?网友:细节定成败!...
- 版本管理:RCS之命令基础篇
- 【文学文娱】《有用无用论》
- Interview Vocabulary Summary
- selenium模拟登陆截取验证码