题目:输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增顺序的。
struct ListNode{
      int    m_nKey;
      ListNode*    m_pNext;
}

测试用例:
1)功能测试(输入的两个链表有多个结点,结点的值互不相同或者存在值相等的多个结点);
2)特殊输入测试(两个链表的一个或者两个头结点为null指针、两个链表中只有一个结点)。
 
实现代码:
package com.yyq;

/**
* Created by Administrator on 2015/9/15.
*/
public class Merge {
public static ListNode merge(ListNode pHead1, ListNode pHead2){
if (pHead1 == null)
return pHead2;
else if(pHead2 == null)
return pHead1;
ListNode pMergedHead = null;
if (pHead1.getM_nValue() < pHead2.getM_nValue()){
pMergedHead = pHead1;
pMergedHead.setM_pNext(merge(pHead1.getM_pNext(), pHead2));
}
else{
pMergedHead = pHead2;
pMergedHead.setM_pNext(merge(pHead1,pHead2.getM_pNext()));
}
return pMergedHead;
} public static void printList(ListNode pListHead) {
if (pListHead == null)
return;
ListNode pNode = pListHead;
while (pNode != null) {
System.out.print(pNode.getM_nValue() + " ");
pNode = pNode.getM_pNext();
}
System.out.println();
} // ====================测试代码====================
public static ListNode Test(String testName, ListNode pHead1, ListNode pHead2)
{
if(testName != null)
System.out.println(testName+" begins:");
System.out.println("The first list is:");
printList(pHead1);
System.out.println("The second list is:");
printList(pHead2); System.out.println("The merged list is:");
ListNode pMergedHead = merge(pHead1, pHead2);
printList(pMergedHead);
return pMergedHead;
} // list1: 1->3->5
// list2: 2->4->6
public static void Test1()
{
ListNode pNode1 = new ListNode(1);
ListNode pNode3 = new ListNode(3);
ListNode pNode5 = new ListNode(5);
pNode1.setM_pNext(pNode3);
pNode3.setM_pNext(pNode5); ListNode pNode2 = new ListNode(2);
ListNode pNode4 = new ListNode(4);
ListNode pNode6 = new ListNode(6);
pNode2.setM_pNext(pNode4);
pNode4.setM_pNext(pNode6); Test("Test1", pNode1, pNode2);
pNode1 = null;
pNode2 = null;
} // 两个链表中有重复的数字
// list1: 1->3->5
// list2: 1->3->5
public static void Test2()
{
ListNode pNode1 = new ListNode(1);
ListNode pNode3 = new ListNode(3);
ListNode pNode5 = new ListNode(5);
pNode1.setM_pNext(pNode3);
pNode3.setM_pNext(pNode5); ListNode pNode2 = new ListNode(1);
ListNode pNode4 = new ListNode(3);
ListNode pNode6 = new ListNode(5);
pNode2.setM_pNext(pNode4);
pNode4.setM_pNext(pNode6); Test("Test2", pNode1, pNode2);
pNode1 = null;
pNode2 = null;
} // 两个链表都只有一个数字
// list1: 1
// list2: 2
public static void Test3()
{
ListNode pNode1 = new ListNode(1);
ListNode pNode2 = new ListNode(2); Test("Test3", pNode1, pNode2);
pNode1 = null;
pNode2 = null;
} // 一个链表为空链表
// list1: 1->3->5
// list2: 空链表
public static void Test4()
{
ListNode pNode1 = new ListNode(1);
ListNode pNode3 = new ListNode(3);
ListNode pNode5 = new ListNode(5);
pNode1.setM_pNext(pNode3);
pNode3.setM_pNext(pNode5);
Test("Test4", pNode1, null);
pNode1 = null;
} // 两个链表都为空链表
// list1: 空链表
// list2: 空链表
public static void Test5()
{
Test("Test5", null, null);
} public static void main(String[] args)
{
Test1();
Test2();
Test3();
Test4();
Test5();
}
}
 
输出结果:
Test1 begins:
The first list is:
1  3  5  
The second list is:
2  4  6  
The merged list is:
1  2  3  4  5  6  
Test2 begins:
The first list is:
1  3  5  
The second list is:
1  3  5  
The merged list is:
1  1  3  3  5  5  
Test3 begins:
The first list is:
1  
The second list is:
2  
The merged list is:
1  2  
Test4 begins:
The first list is:
1  3  5  
The second list is:
The merged list is:
1  3  5  
Test5 begins:
The first list is:
The second list is:
The merged list is:

P114、面试题17:合并两个排序的链表的更多相关文章

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

    题目:输入两个递增的排序的链表,合并这两个链表并使新链表中的节点仍然是 按照递增排序的.例如链表1链表2合并为链表3. List1:->->-> List2:->->-& ...

  2. 剑指Offer:面试题17——合并两个排序的链表

    题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 思路1: 分别用p1,p2两个指针扫描两个有序链表,p3指针去构建新链表h3. p1.val & ...

  3. 《剑指offer》面试题17 合并两个排序的链表 Java版

    我的方法:新初始化一个链表头,比较两个链表当前节点的大小,然后连接到该链表中.遍历两个链表直到null为止. public ListNode merge(ListNode first, ListNod ...

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

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

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

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

  6. 《剑指offer》面试题17—合并两个排序链表

    题目:输入两个递增排顺序的链表,合并这两个链表并使合并后的链表仍是递增排序的. 重点: 1.代码鲁棒性:要判断输入的两个链表都为NULL:其中一个链表为NULL的情况. 2.用递归实现,注意递归的思路 ...

  7. 剑指offer面试题17:合并两个排序的链表

    题目:输入两个递增排序的链表,合并这两个链表并使新链表中的节点人是按照递增排序的.解题思路:两个链表分别都已经是有序的了,遍历链表的时候只要比较两个链表当前位置大小,取出最小的添加到新链表中. 可以有 ...

  8. 剑指Offer面试题:16.合并两个排序的链表

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

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

    自己答案: ListNode* MergeTwoSortedList(ListNode* pHead1,ListNode* pHead2) { if(pHead1==nullptr&& ...

  10. 剑指Offer面试题:13.合并两个排序的链表

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

随机推荐

  1. mysql查询区分大小写与自定义排序

    mysql查询区分大小写: SELECT id,developer FROM products WHERE developer != '' and developer = binary('LYNN') ...

  2. mysql配置优化测试

    http://bjlfp.blog.163.com/blog/static/77368461201211695924524/ 感觉真不错啊.观察几天看看

  3. CentOs Linux 分区建议

    硬盘分区方案 在计算机上安装Linux系统,对硬盘进行分区是一个非常重要的步骤,下面介绍几个分区方案. (1)方案1(桌面)/boot:用来存放与Linux系统启动有关的程序,比如启动引导装载程序等, ...

  4. simple_factory

    #include <stdlib.h> #include <iostream> using namespace std; class Product { public: vir ...

  5. JS 正则 获取URL参数

    function getQueryString(name) { var reg = new RegExp("(^|&)" + name + "=([^&] ...

  6. C#委托的异步调用1

    本文将主要通过“同步调用”.“异步调用”.“异步回调”三个示例来讲解在用委托执行同一个“加法类”的时候的的区别和利弊. 首先,通过代码定义一个委托和下面三个示例将要调用的方法: /*添加的命名空间 u ...

  7. laravel扩展Debugbar

    github地址:https://github.com/barryvdh/laravel-debugbar

  8. 【转】FTP自动上传文件的perl脚本以及配置文件

    这个perl文件将执行的任务是, 按照指定的文件夹目录,自动将该文件夹下的所有文件上传到指定ftp站点的指定目录下 本应用程序设计的几个基本理念是:工具箱再利用:尽可能利用已有的工具:简化运行步骤:不 ...

  9. matlab之点运算基本思想及几何平移变换

    1.对数变换可以增强图像中较暗部分的细节,因为对数可以将较小的值放大,而较大的值缩小 2.伽马变换:y = (x + esp) ^ γ,x,y的取值范围是0到1,esp是补偿系数,γ为伽马系数.γ的不 ...

  10. 2016年辛星less教程发布了

    首先简介一下less吧,它是一个css预处理器.当我们的项目比较大的时候,我们的css的代码量也会急剧的膨胀,因此就有很多方案来让编程更加容易,没错,less就是这样一种技术. 在百度网盘的下载地址为 ...