剑指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? ...
随机推荐
- JSTL 引入
首先要明白jstl有如下版本: jstl1.0的引入方式为: <taglib uri="http://java.sun.com/jstl/core" prefix=&quo ...
- 编写高质量代码改善C#程序的157个建议——建议81:使用Parallel简化同步状态下Task的使用
建议81:使用Parallel简化同步状态下Task的使用 在命名空间System.Threading.Tasks中,有一个静态类Parallel简化了在同步状态下的Task的操作.Parallel主 ...
- innerText兼容性问题
/* text方法,给网页元素设置文本值的方法 主要处理火狐不支持innerText这个属性的问题. 还学习了如何判断一个字符串类型的属性是否存在 如果判断一个对象类型的属性是否存在,用if(ele. ...
- Opengl中的GLUT下的回调函数
void glutDisplayFunc(void (*func)(void)); 注册当前窗口的显示回调函数 参数: func:形为void func()的函数,完成具体的绘制操作 这个函数告诉GL ...
- Gym 100989L (DFS)
AbdelKader enjoys math. He feels very frustrated whenever he sees an incorrect equation and so he tr ...
- sqlite3使用详解(Qt版本)
初始化sqlite3 (创建表) QString url = QDir::currentPath() + QString::fromLocal8Bit("/Msg.db"); bo ...
- Linq转换操作之OfType,Cast,AsEnumerable,ToLookup源码分析
Linq转换操作之OfType,Cast,AsEnumerable,ToLookup源码分析 一:Tolookup 1. 从方法的注解上可以看到,ToLookup也是一个k,v的形式,那么问题来了,它 ...
- Gamma Correction of OIIO
\apiitem{"oiio:ColorSpace" : string} The name of the color space of the color channels. ...
- Windows系统下安装 CMake
在安装caffe框架的时候需要用到cmake,特将cmake的安装总结如下: 1 什么是cmake CMake是一个跨平台的编译(Build)工具,可以用简单的语句来描述所有平台的编译过程.CMake ...
- 【09】循序渐进学 docker:docker swarm
写在前面的话 至此,docker 的基础知识已经了解的差不多了,接下来就来谈谈对于 docker 容器,我们如何来管理它. docker swarm 在学习 docker swarm 之前,得先知道容 ...