《剑指offer》第二十五题(合并两个排序的链表)
// 面试题25:合并两个排序的链表
// 题目:输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按
// 照递增排序的。例如输入图3.11中的链表1和链表2,则合并之后的升序链表如链
// 表3所示。 #include <iostream>
#include "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(const 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();
system("pause");
return ;
}
《剑指offer》第二十五题(合并两个排序的链表)的更多相关文章
- 剑指offer面试题17:合并两个排序的链表
题目:输入两个递增排序的链表,合并这两个链表并使新链表中的节点人是按照递增排序的.解题思路:两个链表分别都已经是有序的了,遍历链表的时候只要比较两个链表当前位置大小,取出最小的添加到新链表中. 可以有 ...
- 剑指Offer面试题:16.合并两个排序的链表
PS:这也是一道出镜率极高的面试题,我相信很多童鞋都会很眼熟,就像于千万人之中遇见不期而遇的人,没有别的话可说,唯有轻轻地问一声:“哦,原来你也在这里? ” 一.题目:合并两个排序的链表 题目:输入两 ...
- 剑指offer——面试题25:合并两个 排序的链表
自己答案: ListNode* MergeTwoSortedList(ListNode* pHead1,ListNode* pHead2) { if(pHead1==nullptr&& ...
- 剑指Offer面试题:13.合并两个排序的链表
一 题目:合并两个排序的链表 题目:输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增排序的.例如输入下图中的链表1和链表2,则合并之后的升序链表如链表3所示. 二 代码实现 te ...
- 【剑指offer】面试题 25. 合并两个排序的链表
面试题 25. 合并两个排序的链表 NowCoder 题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. Java 实现 ListNode Clas ...
- 《剑指offer》面试题25. 合并两个排序的链表
问题描述 输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的. 示例1: 输入:1->2->4, 1->3->4 输出:1->1->2-> ...
- 【剑指offer 面试题17】合并两个排序的链表
思路: 比较两个链表端点值的大小,通过递归的方式排列. #include <iostream> using namespace std; struct ListNode { int val ...
- 《剑指offer》面试题17 合并两个排序的链表 Java版
我的方法:新初始化一个链表头,比较两个链表当前节点的大小,然后连接到该链表中.遍历两个链表直到null为止. public ListNode merge(ListNode first, ListNod ...
- 《剑指offer》面试题17—合并两个排序链表
题目:输入两个递增排顺序的链表,合并这两个链表并使合并后的链表仍是递增排序的. 重点: 1.代码鲁棒性:要判断输入的两个链表都为NULL:其中一个链表为NULL的情况. 2.用递归实现,注意递归的思路 ...
- 剑指Offer(书):合并两个排序的列表
题目:输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 递归版本: public ListNode Merge(ListNode list1,ListNod ...
随机推荐
- Summary: Lowest Common Ancestor in a Binary Tree & Shortest Path In a Binary Tree
转自:Pavel's Blog Now let's say we want to find the LCA for nodes 4 and 9, we will need to traverse th ...
- C语言标准函数源代码
http://ftp.gnu.org/gnu/glibc/ 最新glibc-2.27.tar.gz 直接解压就可以
- 一个新人对HTML的理解
首先 HTML里面包含的东西是什么? 在HTML里面 注释的表示方式是 <!--注释内容--> 注释 HTML初始默认包含了两大部分: 一部分是 <head>< ...
- 【最大连接数】Linux的文件最大连接数
Too many open files ==================================== 查看当前操作系统连接数设置 ulimit -a =================== ...
- linux常用命令:lsof 命令
lsof(list open files) 是一个列出当前系统打开文件的工具.在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件.所以 如传输控制 ...
- RHEL6.4 字符模式下安装图形界面图文教程
本文转自:http://www.cnblogs.com/wahsonleung/p/3230325.html 第1步:当然就是启动redhat,设置映像文件. 第2步:命令行输入yum groupin ...
- Tomcat分windows版和linux版
Tomcat分windows版和linux版 官方下载链接:http://archive.apache.org/dist/tomcat/tomcat-6/v6.0.37/bin/ windows下载e ...
- ssh连接linux服务器不断开- "Write failed: Broken pipe"
我自己用阿里云的服务器的时候,发现ssh连上以后,一会不用就断掉了,非常不方便,服务端的系统是ubuntu. 查了些东西,原来可以去配置服务端的sshd,或者客户端的ssh,就行了. 1,配置服务器端 ...
- 堆(Heap)
两种简单实现 第一种 链表 第一种实现利用链表存储数据,每次在表头插入元素:getMin 时,遍历一遍线性表找到最小的元素,然后将之删除.值返回.(getMax 同理). 链表的在头节点的插入和删除时 ...
- mysql免安装版本(用批处理安装和启动)
参考文章: http://www.cnblogs.com/niuniutry/p/3555778.html http://wenku.baidu.com/link?url=WI9Cyl5AMHOlps ...