题目:输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增顺序的。
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. DEDECMS中,自增长标签

    自增长 arclist 标签下使用 [field:global.autoindex/] 默认从1开始 channel 标签下使用 [field:global.autoindex/] 默认从0开始 ch ...

  2. thinkphp 前后版本ajaxReturn方法的分别

    之前用的是thinkphp2的版本现在改到thinkphp3.2已上的版本,发现ajaxReturn这个方法返回的数据不一样了,现在做下记录 thinkphp2的ajaxReturn的实现原码 pro ...

  3. SQL行列转换:报表_公司采购表_每个公司各采购了些什么产品

    有同学问了个比较典型行列转换的问题,想想,解答如下:数据库有一张表: 是个公司采购表,想转化成如下报表,显示每个公司各采购了些什么产品: 哪些公司采购哪些产品是不确定的,所以报表的列有哪几项是不确定的 ...

  4. preventDefault()、stopPropagation()、return false 之间的区别

    “return false”之所以被误用的如此厉害,是因为它看起来像是完成了我们交给它的工作,浏览器不会再将我们重定向到href中的链接,表单也不会被继续提交,但这么做到底有什么不对呢? 可能在你刚开 ...

  5. asp.net get server control id from javascript

    var WhateverValue = document.getElementById('<%= saveValue.ClientID %>').value

  6. JavaScript的语法要点 4 - 面向对象的基础

    在传统的面向对象语言如C++.C#.Java中有类.对象.继承等概念.在JavaScript中又如何表示呢?JavaScript中没有class关键字,JavaScript中的类.对象.继承的概念是通 ...

  7. C# Winform程序请求管理员权限

    如果你的Winform程序需要管理员权限才能正常执行,请加入如下代码: static class Program { /// <summary> /// 应用程序的主入口点. /// &l ...

  8. C# 构造函数中调用虚方法的问题

    请看下面代码: using System; public class A{ public A(){ M1(); } public virtual void M1(){} } public class ...

  9. 汽车之家, 比亚迪等成为开源数据库SSDB的用户

    开源的 NoSQL 数据库 SSDB 已经一岁多了! 在这一年中, SSDB 不断被应用在众多业界知名互联网企业, 创业团队的产品中. 最近, 比亚迪汽车也成为 SSDB 的用户, 其将 SSDB 作 ...

  10. Objective-C程序结构及语法特点

    程序文件分为头文件(.h)和实现文件(.m): 使用#import关键字将所需的头文件导入程序,并且可以避免程序重复引用相同的头文件: @autoreleasepool { … } 自动释放池: 符号 ...