剑指offer——面试题25:合并两个 排序的链表
自己答案:
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:合并两个 排序的链表的更多相关文章
- 剑指Offer:面试题17——合并两个排序的链表
题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 思路1: 分别用p1,p2两个指针扫描两个有序链表,p3指针去构建新链表h3. p1.val & ...
- 剑指Offer - 九度1519 - 合并两个排序的链表
剑指Offer - 九度1519 - 合并两个排序的链表2013-11-30 22:04 题目描述: 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则.(hi ...
- 剑指offer十六之合并两个排序的链表
一.题目 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 二.思路 注:链表1和链表2是两个递增排序的链表,合并这两个链表得到升序链表为链表3. 首先分析 ...
- 【剑指Offer】16、合并两个排序的链表
题目描述: 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 解题思路: 首先需要判断几个特殊情况,即判断输入的两个指针是否为空.如果第一个 ...
- 剑指offer(16)合并两个排序的链表
题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 题目分析 重点抓住这两个链表都是单挑递增的,因此我们只需要不断地比较他们的头结点就行,明显这是个 ...
- 【剑指offer】面试题 25. 合并两个排序的链表
面试题 25. 合并两个排序的链表 NowCoder 题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. Java 实现 ListNode Clas ...
- 《剑指offer》面试题25. 合并两个排序的链表
问题描述 输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的. 示例1: 输入:1->2->4, 1->3->4 输出:1->1->2-> ...
- 剑指 Offer 25. 合并两个排序的链表
剑指 Offer 25. 合并两个排序的链表 Offer 25 该问题的原型就是多项式的合并. 实现较简单,没有特殊需要注意的问题. package com.walegarrett.offer; /* ...
- [剑指offer]25.合并两个排序的链表(迭代+递归)
25.合并两个排序的链表 题目 输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的. 示例1: 输入:1->2->4, 1->3->4 输出:1-> ...
- 【剑指Offer面试题】 九度OJ1518:反转链表
与其非常快写出一段漏洞百出的代码,倒不如细致分析再写出鲁棒的代码. 提前想好測试用例(输入非空等等)进行測试改动代码. 题目链接地址: http://ac.jobdu.com/problem.php? ...
随机推荐
- 并发编程CAS操作
并发编程CAS操作 简介 CAS即compare and swap,中文就是比较并交换 CAS是Java并发包的基石 原理 其实CAS的原理相对来说比较简单.将要被改变的数据和期望的值作比较,当两个值 ...
- Dubbo的配置及启动
Tomcat+Dubbo安装 1.将tomcat的webapps目录下的所有文件清空,讲Dubbo管理控制台的程序dubbo-admin-2.5.3.war放 到webapps中,并且解压命名为ROO ...
- 【转载】Redis优化经验
转载地址:http://blog.sina.com.cn/s/blog_4be888450100z2ze.html 内存管理优化 Redis Hash是value内部为一个HashMap,如果该Map ...
- javascript总结23:javascript 数据类型与变量
1 基本类型和引用类型 JavaScript中的数据类型分为两类:基本类型和引用类型 基本类型:直接存储值,画图解释 Number.String.Boolean Undefined.Null 引用类 ...
- Integer和String "+""=="方法的不同
在上面的两个篇博客中,我们看到String和Integer不同的常量池的变现形式 我们再看一个例子: public static void main(String[] args) { // TODO ...
- MongoDBAppender
分三步: 1. client 2. appender 3. 配置文件 logback-test.xml <configuration> <appender name="MO ...
- SOAP协议初级指南 (三)
独立元素 在SOAP中, 一个独立元素表示至少被一个多引用存取元素引用的类型的实例.所有的独立元素用soap:id属性作标记,而且这个属性的值在整个SOAP envelope中必须是唯一的.独立的元素 ...
- Gym - 100989G (二分法)
There are K hours left before Agent Mahone leaves Amman! Hammouri doesn't like how things are going ...
- 基于JDBC的数据库连接池技术研究与应用
引言 近年来,随着Internet/Intranet建网技术的飞速发展和在世界范围内的迅速普及,计算机 应用程序已从传统的桌面应用转到Web应用.基于B/S(Browser/Server)架构的3层开 ...
- 利用 StartLoadingStatus 和 FinishLoadingStatus 读取数据特别是大数据时增加渐隐渐显等待特效 - Ehlib学习(三)
代码很简单: DBGrideh.StartLoadingStatus(' Loading ... '); Sleep(500); DBGrideh.FinishLoadingStatus; 做下变动: ...