剑指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? ...
随机推荐
- Microsoft(C)注册服务器(32位)CPU占用高
Microsoft(C)注册服务器(32位)CPU占用高 摘自:https://blog.csdn.net/jtsqrj/article/details/83034252 2018年10月12日 23 ...
- 【转】C语言中DEFINE简介及多行宏定义
要写好C语言,漂亮的宏定义是非常重要的.宏定义可以帮助我们防止出错,提高代码的可移植性和可读性等. 在软件开发过程中,经常有一些常用或者通用的功能或者代码段,这些功能既可以写成函数,也可以封装成为宏定 ...
- [GO]方法的继承
package main import "fmt" type Person struct { name string sex byte age int } func (tmp Pe ...
- QT学习之窗口部件
对话框--QDialog 模态对话框与非模态对话框 模态对话框:就是相当于没关闭它之前,不能再和该应用程序的其他窗口进行交互(比如新建项目时弹出的对话框) 非模态对话框:可以与它交互,也可以与该程序中 ...
- CodeForces 682B Alyona and Mex (题意水题)
题意:给定一个序列,你可以对这里面的数用小于它的数来代替,最后让你求,改完后的最大的序列中缺少的最小的数. 析:这个题,读了两个多小时也没读懂,要是读懂了,肯定能做出来...没什么可说的,就是尽量凑1 ...
- 查看HDFS集群信息
clusterID:集群ID,必须保持一致 1)在NameNode上查看 cat $HADOOP_HOME/dfs/name/current/VERSION #Fri Apr 18 11:56:57 ...
- SpringCloud教程 | 第二篇: 服务消费者(rest+ribbon)(Finchley版本)
在上一篇文章,讲了服务的注册和发现.在微服务架构中,业务都会被拆分成一个独立的服务,服务与服务的通讯是基于http restful的.Spring cloud有两种服务调用方式,一种是ribbon+r ...
- Lazy<T> 提供对延迟初始化的支持
延迟初始化 就是在第一次使用的时候在 进行类的初始化 public class Student { public Student() { this.Name = "DefaultName& ...
- Nhibernate 存储过程获取返回值
写在前面:因为项目使用ssh.net所以做着做着要调用存储过程,而且是有返回值的,按照以前的做法直接在参数里指定下就可以获取,但是在nhibernate里调用就有点陌生了,百度一下得出的结果有两种:第 ...
- vmware获取主机、数据中心等对象ManagedObjectReference
在vmware的api中提供以下列表中的对象,称作ManagedObjectReference,包括虚拟机信息.主机.数据中心等等一些信息,我们可以通过vcenter的web api得到. 下面我们来 ...