自己答案:

 ListNode* MergeTwoSortedList(ListNode* pHead1,ListNode* pHead2)
{
if(pHead1==nullptr&&pHead2==nullptr)
return nullptr; if(pHead1==nullptr)
return pHead2; if(pHead2==nullptr)
return pHead1; ListNode* pHead=(pHead1->m_Value<pHead2->m_Value)?pHead1:pHead2; ListNode* pNode1=pHead1;
ListNode* pNode2=pHead2;
while(pNode1!=nullptr&&pNode2!=nullptr)
{
ListNode* pNext1=pNode1->m_pNext;
ListNode* pNext2=pNode2->m_pNext; if(pNode1->m_Value<pNode2->m_Value)
{
if((pNext1!=nullptr&&pNext1->m_Value>pNode2->m_Value)||pNext1==nullptr)
pNode1->m_pNext=pNode2;
pNode1=pNext1;
}
else
{
if((pNext2!=nullptr&&pNext2->m_Value>pNode1->m_Value)||pNext2==nullptr)
pNode2->m_pNext=pNode1;
pNode2=pNext2;
}
}
return pHead;
}

函数

#include"List.h"

void  Test(char* testName,ListNode* pHead,int* expect,int length)
{
cout<<testName<<":";
ListNode* pNode=pHead;
int cnt=;
while(pNode!=nullptr)
{
if(pNode->m_Value!=expect[cnt])
break;
pNode=pNode->m_pNext;
cnt++;
}
if(cnt==length)
cout<<"Passed."<<endl;
else
cout<<"Failed."<<endl;
} void Test1()
{
ListNode* pNode1_1=nullptr;
ListNode* pNode2_1=nullptr;
ListNode* pHead=MergeTwoSortedList(pNode1_1,pNode2_1);
Test("test1",pHead,nullptr,);
} void Test2()
{
ListNode* pNode1_1=nullptr;
ListNode* pNode2_1=CreateListNode();
ListNode* pNode2_2=CreateListNode();
ConnectListNodes(pNode2_1,pNode2_2);
ListNode* pHead=MergeTwoSortedList(pNode1_1,pNode2_1);
int data[]={,};
Test("test2",pHead,data,);
} void Test3()
{
ListNode* pNode2_1=nullptr;
ListNode* pNode1_1=CreateListNode();
ListNode* pNode1_2=CreateListNode();
ConnectListNodes(pNode1_1,pNode1_2);
ListNode* pHead=MergeTwoSortedList(pNode1_1,pNode2_1);
int data[]={,};
Test("test3",pHead,data,);
} void Test4()
{
ListNode* pNode2_1=CreateListNode();
ListNode* pNode1_1=CreateListNode();
ListNode* pNode1_2=CreateListNode();
ConnectListNodes(pNode1_1,pNode1_2);
ListNode* pHead=MergeTwoSortedList(pNode1_1,pNode2_1);
int data[]={,,};
Test("test4",pHead,data,);
} void Test5()
{
ListNode* pNode2_1=CreateListNode();
ListNode* pNode1_1=CreateListNode();
ListNode* pNode1_2=CreateListNode();
ConnectListNodes(pNode1_1,pNode1_2);
ListNode* pHead=MergeTwoSortedList(pNode1_1,pNode2_1);
int data[]={,,};
Test("test4",pHead,data,);
} void Test6()
{
ListNode* pNode2_1=CreateListNode();
ListNode* pNode2_2=CreateListNode();
ListNode* pNode2_3=CreateListNode();
ConnectListNodes(pNode2_1,pNode2_2);
ConnectListNodes(pNode2_2,pNode2_3); ListNode* pNode1_1=CreateListNode();
ListNode* pNode1_2=CreateListNode();
ListNode* pNode1_3=CreateListNode();
ConnectListNodes(pNode1_1,pNode1_2);
ConnectListNodes(pNode1_2,pNode1_3);
ListNode* pHead=MergeTwoSortedList(pNode1_1,pNode2_1);
int data[]={,,,,,};
Test("test6",pHead,data,);
} void Test7()
{
ListNode* pNode2_1=CreateListNode();
ListNode* pNode2_2=CreateListNode();
ListNode* pNode2_3=CreateListNode();
ConnectListNodes(pNode2_1,pNode2_2);
ConnectListNodes(pNode2_2,pNode2_3); ListNode* pNode1_1=CreateListNode();
ListNode* pNode1_2=CreateListNode();
ListNode* pNode1_3=CreateListNode();
ConnectListNodes(pNode1_1,pNode1_2);
ConnectListNodes(pNode1_2,pNode1_3);
ListNode* pHead=MergeTwoSortedList(pNode1_1,pNode2_1);
int data[]={,,,,,};
Test("test7",pHead,data,);
} int main()
{
Test1();
Test2();
Test3();
Test4();
Test5();
Test6();
Test7(); return ;
}

测试代码

官方答案:

 ListNode* MergeTwoSortedListWihtRecursive(ListNode* pHead1,ListNode* pHead2)
{
if(pHead1==nullptr || pHead2==nullptr)
{
return nullptr;
}
if(pHead1==nullptr)
{
return pHead2;
}
if(pHead2==nullptr)
{
return pHead1;
} ListNode* pHead=nullptr; if(pHead1->m_Value<pHead2->m_Value)
{
pHead=pHead1;
pHead->m_pNext=MergeTwoSortedListWihtRecursive(pHead1->m_pNext,pHead2);
}
else
{
pHead=pHead2;
pHead->m_pNext=MergeTwoSortedListWihtRecursive(pHead1,pHead2->m_pNext);
}
return pHead;
}

函数(递归)

 // 面试题25:合并两个排序的链表
// 题目:输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按
// 照递增排序的。例如输入图3.11中的链表1和链表2,则合并之后的升序链表如链
// 表3所示。 #include <cstdio>
#include "..\Utilities\List.h" ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
{
if(pHead1 == nullptr)
return pHead2;
else if(pHead2 == nullptr)
return pHead1; ListNode* pMergedHead = nullptr; if(pHead1->m_nValue < pHead2->m_nValue)
{
pMergedHead = pHead1;
pMergedHead->m_pNext = Merge(pHead1->m_pNext, pHead2);
}
else
{
pMergedHead = pHead2;
pMergedHead->m_pNext = Merge(pHead1, pHead2->m_pNext);
} return pMergedHead;
} // ====================测试代码====================
ListNode* Test(char* testName, ListNode* pHead1, ListNode* pHead2)
{
if(testName != nullptr)
printf("%s begins:\n", testName); printf("The first list is:\n");
PrintList(pHead1); printf("The second list is:\n");
PrintList(pHead2); printf("The merged list is:\n");
ListNode* pMergedHead = Merge(pHead1, pHead2);
PrintList(pMergedHead); printf("\n\n"); return pMergedHead;
} // list1: 1->3->5
// list2: 2->4->6
void Test1()
{
ListNode* pNode1 = CreateListNode();
ListNode* pNode3 = CreateListNode();
ListNode* pNode5 = CreateListNode(); ConnectListNodes(pNode1, pNode3);
ConnectListNodes(pNode3, pNode5); ListNode* pNode2 = CreateListNode();
ListNode* pNode4 = CreateListNode();
ListNode* pNode6 = CreateListNode(); ConnectListNodes(pNode2, pNode4);
ConnectListNodes(pNode4, pNode6); ListNode* pMergedHead = Test("Test1", pNode1, pNode2); DestroyList(pMergedHead);
} // 两个链表中有重复的数字
// list1: 1->3->5
// list2: 1->3->5
void Test2()
{
ListNode* pNode1 = CreateListNode();
ListNode* pNode3 = CreateListNode();
ListNode* pNode5 = CreateListNode(); ConnectListNodes(pNode1, pNode3);
ConnectListNodes(pNode3, pNode5); ListNode* pNode2 = CreateListNode();
ListNode* pNode4 = CreateListNode();
ListNode* pNode6 = CreateListNode(); ConnectListNodes(pNode2, pNode4);
ConnectListNodes(pNode4, pNode6); ListNode* pMergedHead = Test("Test2", pNode1, pNode2); DestroyList(pMergedHead);
} // 两个链表都只有一个数字
// list1: 1
// list2: 2
void Test3()
{
ListNode* pNode1 = CreateListNode();
ListNode* pNode2 = CreateListNode(); ListNode* pMergedHead = Test("Test3", pNode1, pNode2); DestroyList(pMergedHead);
} // 一个链表为空链表
// list1: 1->3->5
// list2: 空链表
void Test4()
{
ListNode* pNode1 = CreateListNode();
ListNode* pNode3 = CreateListNode();
ListNode* pNode5 = CreateListNode(); ConnectListNodes(pNode1, pNode3);
ConnectListNodes(pNode3, pNode5); ListNode* pMergedHead = Test("Test4", pNode1, nullptr); DestroyList(pMergedHead);
} // 两个链表都为空链表
// list1: 空链表
// list2: 空链表
void Test5()
{
ListNode* pMergedHead = Test("Test5", nullptr, nullptr);
} int main(int argc, char* argv[])
{
Test1();
Test2();
Test3();
Test4();
Test5(); return ;
}

测试代码

剑指offer——面试题25:合并两个 排序的链表的更多相关文章

  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】16、合并两个排序的链表

      题目描述:   输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则.   解题思路:   首先需要判断几个特殊情况,即判断输入的两个指针是否为空.如果第一个 ...

  5. 剑指offer(16)合并两个排序的链表

    题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 题目分析 重点抓住这两个链表都是单挑递增的,因此我们只需要不断地比较他们的头结点就行,明显这是个 ...

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

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

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

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

  8. 剑指 Offer 25. 合并两个排序的链表

    剑指 Offer 25. 合并两个排序的链表 Offer 25 该问题的原型就是多项式的合并. 实现较简单,没有特殊需要注意的问题. package com.walegarrett.offer; /* ...

  9. [剑指offer]25.合并两个排序的链表(迭代+递归)

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

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

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

随机推荐

  1. Microsoft(C)注册服务器(32位)CPU占用高

    Microsoft(C)注册服务器(32位)CPU占用高 摘自:https://blog.csdn.net/jtsqrj/article/details/83034252 2018年10月12日 23 ...

  2. 【转】C语言中DEFINE简介及多行宏定义

    要写好C语言,漂亮的宏定义是非常重要的.宏定义可以帮助我们防止出错,提高代码的可移植性和可读性等. 在软件开发过程中,经常有一些常用或者通用的功能或者代码段,这些功能既可以写成函数,也可以封装成为宏定 ...

  3. [GO]方法的继承

    package main import "fmt" type Person struct { name string sex byte age int } func (tmp Pe ...

  4. QT学习之窗口部件

    对话框--QDialog 模态对话框与非模态对话框 模态对话框:就是相当于没关闭它之前,不能再和该应用程序的其他窗口进行交互(比如新建项目时弹出的对话框) 非模态对话框:可以与它交互,也可以与该程序中 ...

  5. CodeForces 682B Alyona and Mex (题意水题)

    题意:给定一个序列,你可以对这里面的数用小于它的数来代替,最后让你求,改完后的最大的序列中缺少的最小的数. 析:这个题,读了两个多小时也没读懂,要是读懂了,肯定能做出来...没什么可说的,就是尽量凑1 ...

  6. 查看HDFS集群信息

    clusterID:集群ID,必须保持一致 1)在NameNode上查看 cat $HADOOP_HOME/dfs/name/current/VERSION #Fri Apr 18 11:56:57 ...

  7. SpringCloud教程 | 第二篇: 服务消费者(rest+ribbon)(Finchley版本)

    在上一篇文章,讲了服务的注册和发现.在微服务架构中,业务都会被拆分成一个独立的服务,服务与服务的通讯是基于http restful的.Spring cloud有两种服务调用方式,一种是ribbon+r ...

  8. Lazy<T> 提供对延迟初始化的支持

    延迟初始化  就是在第一次使用的时候在 进行类的初始化 public class Student { public Student() { this.Name = "DefaultName& ...

  9. Nhibernate 存储过程获取返回值

    写在前面:因为项目使用ssh.net所以做着做着要调用存储过程,而且是有返回值的,按照以前的做法直接在参数里指定下就可以获取,但是在nhibernate里调用就有点陌生了,百度一下得出的结果有两种:第 ...

  10. vmware获取主机、数据中心等对象ManagedObjectReference

    在vmware的api中提供以下列表中的对象,称作ManagedObjectReference,包括虚拟机信息.主机.数据中心等等一些信息,我们可以通过vcenter的web api得到. 下面我们来 ...