自己答案:

 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. IE6,7,8在boostrap中兼容h5和css3

    IE6.7.8版本(IE9以下版本)浏览器兼容html5新增的标签,引入下面代码文件即可: <script src="https://oss.maxcdn.com/libs/html5 ...

  2. R语言笔记完整版

    [R笔记]R语言函数总结   R语言与数据挖掘:公式:数据:方法 R语言特征 对大小写敏感 通常,数字,字母,. 和 _都是允许的(在一些国家还包括重音字母).不过,一个命名必须以 . 或者字母开头, ...

  3. jenkins持续集成之Global Tool Configuration的配置

    Global Tool Configuration的配置过程: 1.点击系统管理2.点击 Global Tool Configuration3.必须配置: jdk git ant maven 1.点击 ...

  4. vscode填坑之旅: vscode设置中文,设置中文不成功问题

    刚安装好的vscode界面显示中文,如何设置中文呢? 在locale.json界面设置”locale":"zh-cn"也未能实现界面为中文,在网上找了参考了,以下教程真实 ...

  5. PrintWriter类

    PrintWriter是一种过滤流,也是一种处理流,即能对字节流和字符流进行处理. 1.查询API后,我们发现,会有八种构造方法.即: PrintWriter(File file) Creates a ...

  6. SpringMVC错误集中营

    1.eclipse里的错误提示为The import javax.servlet.http.HttpServletRequest cannot be resolved 1.这是因为工程里面web-in ...

  7. 五)使用 easyui-tabs 遭遇错误 Unexpected Exception caught setting '_' on

    十月 10, 2015 3:08:35 下午 com.opensymphony.xwork2.interceptor.ParametersInterceptor error 严重: Developer ...

  8. 编写高质量代码改善C#程序的157个建议——建议81:使用Parallel简化同步状态下Task的使用

    建议81:使用Parallel简化同步状态下Task的使用 在命名空间System.Threading.Tasks中,有一个静态类Parallel简化了在同步状态下的Task的操作.Parallel主 ...

  9. Alpha冲刺(十)

    Information:   队名:彳艮彳亍团队 组长博客:戳我进入 作业博客:班级博客本次作业的链接 Details: 组员1(组长)柯奇豪 过去两天完成了哪些任务 本人负责的模块(共享编辑)的前端 ...

  10. 基于FPGA的XPT2046触摸控制器设计

    基于FPGA的XPT2046触摸控制器设计 小梅哥编写,未经许可,文章内容和所涉及代码不得用于其他商业销售的板卡 本实例所涉及代码均可通过向 xiaomeige_fpga@foxmail.com  发 ...