(剑指Offer)面试题17:合并两个排序的链表
题目:
输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然时按照递增排序的。
链表结点定义如下:
- struct ListNode{
- int val;
- ListNode* next;
- };
思路:
合并两个递增排序的链表,思想类似于归并排序的merge过程。
1、当两个链表均不为空,
如果链表1头结点的值小于链表2头结点的值,那么链表1的头结点作为新链表的头结点,否则链表2的头结点作为新链表的头结点,链表指针往前走一步;
对两个链表中剩余结点的操作同步骤1一样;(这是一个递归的过程)
2、当两个链表至少有一个为空,
新链表指针指向非空的那一个;
代码:
- struct ListNode{
- int val;
- ListNode* next;
- };
- // recursive method
- ListNode* Merge_1(ListNode* pHead1, ListNode* pHead2){
- if(pHead1==NULL)
- return pHead2;
- if(pHead2==NULL)
- return pHead1;
- if(pHead1->val<pHead2->val){
- pHead1->next=Merge_1(pHead1->next,pHead2);
- return pHead1;
- }
- else{
- pHead2->next=Merge_1(pHead1,pHead2->next);
- return pHead2;
- }
- }
- // non-recursive method
- ListNode* Merge_2(ListNode* pHead1, ListNode* pHead2){
- ListNode *p=new ListNode();
- ListNode *MergeHead=p;
- while(pHead1!=NULL && pHead2!=NULL){
- if(pHead1->val<pHead2->val){
- MergeHead->next=pHead1;
- pHead1=pHead1->next;
- }
- else{
- MergeHead->next=pHead2;
- pHead2=pHead2->next;
- }
- MergeHead=MergeHead->next;
- }
- if(pHead1==NULL)
- MergeHead->next=pHead2;
- if(pHead2==NULL)
- MergeHead->next=pHead1;
- return p->next;
- }
在线测试OJ:
http://www.nowcoder.com/books/coding-interviews/d8b6b4358f774294a89de2a6ac4d9337?rp=1
AC代码:
- class Solution {
- public:
- ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
- {
- if(pHead1==NULL)
- return pHead2;
- if(pHead2==NULL)
- return pHead1;
- if(pHead1->val<pHead2->val){
- pHead1->next=Merge(pHead1->next,pHead2);
- return pHead1;
- }
- else{
- pHead2->next=Merge(pHead1,pHead2->next);
- return pHead2;
- }
- }
- };
- class Solution {
- public:
- ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
- {
- ListNode *p=new ListNode(0);
- ListNode *MergeHead=p;
- while(pHead1!=NULL && pHead2!=NULL){
- if(pHead1->val<pHead2->val){
- MergeHead->next=pHead1;
- pHead1=pHead1->next;
- }
- else{
- MergeHead->next=pHead2;
- pHead2=pHead2->next;
- }
- MergeHead=MergeHead->next;
- }
- if(pHead1==NULL)
- MergeHead->next=pHead2;
- if(pHead2==NULL)
- MergeHead->next=pHead1;
- return p->next;
- }
- };
(剑指Offer)面试题17:合并两个排序的链表的更多相关文章
- 剑指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-面试题17.合并两个排序的链表
题目:输入两个递增的排序的链表,合并这两个链表并使新链表中的节点仍然是 按照递增排序的.例如链表1链表2合并为链表3. List1:->->-> List2:->->-& ...
- 《剑指offer》面试题17 合并两个排序的链表 Java版
我的方法:新初始化一个链表头,比较两个链表当前节点的大小,然后连接到该链表中.遍历两个链表直到null为止. public ListNode merge(ListNode first, ListNod ...
- 【剑指offer】面试题 25. 合并两个排序的链表
面试题 25. 合并两个排序的链表 NowCoder 题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. Java 实现 ListNode Clas ...
- 【剑指Offer面试题】 九度OJ1518:反转链表
与其非常快写出一段漏洞百出的代码,倒不如细致分析再写出鲁棒的代码. 提前想好測试用例(输入非空等等)进行測试改动代码. 题目链接地址: http://ac.jobdu.com/problem.php? ...
- 剑指offer面试题17:合并两个排序的链表
题目:输入两个递增排序的链表,合并这两个链表并使新链表中的节点人是按照递增排序的.解题思路:两个链表分别都已经是有序的了,遍历链表的时候只要比较两个链表当前位置大小,取出最小的添加到新链表中. 可以有 ...
随机推荐
- ORACLE创建、修改、删除序列
ORACLE没有象SQL SERVER中一样的自增加字段,要实现只能通过SEQUENCE来实现. 1.创建序列语法:(需要CREATE SEQUENCE系统权限) CREATE SEQUENCE 序列 ...
- 定时组件quartz系列<二>quartz的原理
Quartz是一个大名鼎鼎的Java版开源定时调度器,功能强悍,使用方便. 一.核心概念 Quartz的原理不是很复杂,只要搞明白几个概念,然后知道如何去启动和关闭一个调度程序即可. 1. ...
- tar 实现增量备份
使用 tar -g 参数进行增量备份实验 完整备份: #执行完整备份tar -g snapshot -zcf back.tar.gz back #查看 tarball 内容[huzi@mail ~]$ ...
- 嵌入式 uboot以及kernel添加看门狗临时记录(个人记录未整理乱)
Uboot_Kernerl_Add_Watch_Dog: U-Boot 2010.06 (Nov 01 2013 - 15:28:44) DRAM: 128 MiBCheck spi flash c ...
- mysql优化SQL语句的一般步骤及常用方法
一.优化SQL语句的一般步骤 1. 通过show status命令了解各种SQL的执行频率 mysqladmin extended-status 或: show [session|global]sta ...
- 【PHP】linux搭建PHP运行环境
之前在windows下写了hello world,终归是不够用啊,因为开发环境是Linux,怎么办呢~~~学习学习再学习 写在前面的话:我从百度文库的一个文章里摘出来的,原文章名称<Linux下 ...
- extern "c" 的作用
作用:实现C和C++混合编程. 原理:C和C++编译器编译之后,函数名会编译成不同的名字,链接阶段名字查找会找不到目标,后面实例中会详解. 用法:①.c文件中定义的函数,.cpp文件要调用时,该.cp ...
- R工作空间
工作空间,指的是你现有的R语言工作环境,它包括了任何一个用户定义的对象,比如:向量,矩阵,数据结构,列表,方法等.在一个R会话结束的时候,你可以保存现有的工作空间的映像,在下一次R启动的时候,该工作空 ...
- ShellExecute的各种用法
一.利用系统默认的邮件收发器发送电子邮件 Uses ..., ShellAPI; Var lpHwnd: HWND; lpOperation, lpFile, lpParameters, lpDire ...
- 打造自己的Markdown编辑器
原文链接: http://www.errdev.com/post/5/ Markdown以其简洁的语法赢得了广大程序猿的喜爱,搜了一下github上相关的web编辑器,星星比较多的 Stackedi ...