剑指offer-面试题17.合并两个排序的链表
题目:输入两个递增的排序的链表,合并这两个链表并使新链表中的节点仍然是
按照递增排序的。例如链表1链表2合并为链表3.
List1:->->-> List2:->->-> List3:->->->->->->->
链表结点定义如下:
struct ListNode
{
int m_nValue;
ListNode* m_pNext;
}
其实我们可以简单梳理下流程如下:
1.两个指针分别指向List1和List2的头结点。设为ptr1和ptr2
2.比较ptr1和ptr2结点的值,ptr1<ptr2则ptr1则是合并后的链表头结点
3.ptr1向后移动一个结点此时再比较 ptr1>ptr2则将ptr2的节点插入到头结点之后
4.当ptr1或者ptr2到达末尾时 比如ptr1到达List1结尾后 若此时ptr2还未到List2结尾
将ptr2插入到新排序的链表后面.
代码实现如下:
#include <iostream>
using namespace std; struct ListNode
{
int data;
struct ListNode *next;
}; struct ListNode* CreateList()
{
struct ListNode* Head,*p;
Head=(struct ListNode*)malloc(sizeof(ListNode));
Head->data=;
Head->next=NULL;
p=Head; cout<<"Create List....(0-exit!)"<<endl;
while(true)
{
int Data;
cin>>Data;
if(Data!=)
{
struct ListNode* NewNode;
NewNode=(struct ListNode*)malloc(sizeof(ListNode));
NewNode->data=Data;
NewNode->next=NULL;
p->next=NewNode;
p=p->next;
}
else
{
break;
}
} return Head->next;
} void PrintList(struct ListNode* Head)
{
cout<<"The List is: "; struct ListNode *p;
p=Head;
while(p!=NULL)
{
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
} struct ListNode* Merge(ListNode* pHead1,ListNode* pHead2)
{
if(pHead1==NULL&&pHead2==NULL)
return NULL; if(pHead1==NULL&&pHead2!=NULL)
return pHead2; if(pHead1!=NULL&&pHead2==NULL)
return pHead1; struct ListNode *ptr1,*ptr2,*MergeList,*newhead;; ptr1=pHead1;
ptr2=pHead2; if(ptr1->data>ptr2->data)
{
MergeList=ptr2;
ptr2=ptr2->next;
}
else
{
MergeList=ptr1;
ptr1=ptr1->next;
} newhead=MergeList; while(ptr1!=NULL&&ptr2!=NULL)
{
if(ptr1->data>ptr2->data)
{
MergeList->next=ptr2;
ptr2=ptr2->next;
MergeList=MergeList->next;
} if(ptr1->data<ptr2->data)
{
MergeList->next=ptr1;
ptr1=ptr1->next;
MergeList=MergeList->next;
}
} if(ptr1!=NULL)
{
while(ptr1!=NULL)
{
MergeList->next=ptr1;
ptr1=ptr1->next;
MergeList=MergeList->next;
}
MergeList->next=NULL;
}
if(ptr2!=NULL)
{
while(ptr2!=NULL)
{
MergeList->next=ptr2;
ptr2=ptr2->next;
MergeList=MergeList->next;
}
MergeList->next=NULL;
} return newhead;
} int main()
{
ListNode *List1,*List2,*MergeList;
List1=CreateList();
PrintList(List1);
List2=CreateList();
PrintList(List2);
MergeList=Merge(List1,List2);
PrintList(MergeList);
return ;
}
运行截图:
剑指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 合并两个排序的链表 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:合并两个排序的链表
题目:输入两个递增排序的链表,合并这两个链表并使新链表中的节点人是按照递增排序的.解题思路:两个链表分别都已经是有序的了,遍历链表的时候只要比较两个链表当前位置大小,取出最小的添加到新链表中. 可以有 ...
随机推荐
- <转载>linux gcc编译器中使用gdb单步调试程序,程序不是顺序执行的。
原文地址http://blog.csdn.net/abc78400123/article/details/6779108 在用gdb调试,使用s 或n单步执行程序时,发现程序不是按顺序运行的,有时莫名 ...
- python学习之路-10 网络编程之进阶
本篇介绍内容 作用域 python类的多继承 IO多路复用 socketserver之源码剖析 多线程和多进程 作用域 if 1 == 1: name = "xxx" print( ...
- Android开源库集锦
一.兼容类库 ActionBarSherlock : Action Bar是Android 3.0后才开始支持的,ActionBarSherlock是让Action Bar功能支持2.X后的所有平台, ...
- Oracle sga、pga介绍改动
oracle推荐OLTP(on-line TransactionProcessing)系统oracle占系统总内存的80%,然后再分配80%给SGA,20%给PGA.也就是 SGA=system_to ...
- 【SVN Working copy is too old (format 10, created by Subversion 1.6)】解决方式
SVN同步或者提交的时候出现类似错误信息: The working copy needs to be upgraded svn: Working copy 'D:\adt-bundle-windows ...
- Codeforces 67C Sequence of Balls 编辑距离 dp
题目链接:点击打开链接 有一个交换操作比較特殊,所以记录每一个点距离自己近期的那个字符的位置 然后交换就相当于把第一行要交换的2个字符 之间的字符都删掉 把第二行要交换的2个字符 之间的字符都插入第一 ...
- qt 操作excel表格
自己编写的一个Qt C++类,用于操作excel表格,在Qt中操作excel需在.pro中增加CONFIG+=qaxcontainer配置. 1.打开Excel:objExcel = new QAx ...
- Git 推送分支
1.推送本地分支到远程: git push origin master 推送本地分支 master 到 远程的 origin 上面 git push origin test 将本地分支test推 ...
- input输入字母自动大小写转换
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
- 用cflow工具生成代码函数调用关系
1. 安装 sudo apt-get install cflow 2.使用 cflow [options...] [file]... 例: cflow main.c 生成main.c文件例的函数调用关 ...