版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第c++如何实现归并两个有序链表目录归并两个有序链表1、题目描述2、设计思路将两个有序链表合并为一个新的有序链表并返回示例在力扣上的提交结果
归并两个有序链表
1、题目描述
利用基础题里构建的单链表类创建两个有序的整数链表对象,实现将两个有序链表归并成一个新的有序链表并输出该新有序链表的结果。(可以调用已定义的链表类的方法来实现,并注意如何将两个有序的线性表进行归并的算法)
2、设计思路
首先通过InputRear()函数构造两个链表,通过不断修改last指针的指向。
last-link=newNode;
last=newNode;
只要用户没有输入标志结束的数据0,便一直将链表扩展下去。
最终令last-link=NULL;
链表的合并,整体思路与顺序表的合并相似,通过比较两个链表元素的大小,将小的元素赋值给新的链表,指针不断改变指向以循环整个链表
r-link=p;
r=p;
p=p-link;
或者是
r-link=q;
r=q;
q=q-link;
与线性表不同的是,链表中判断一个链表是否取遍可用p是否等于NULL来确定,当一个链表取遍后,将另一个链表剩下的结点连接到新链表即可。
头文件代码如下:
#includeiostream
usingnamespacestd;
//#include"LinearList.h"
templateclassT
//结点结构定义
structLinkNode{
Tdata;
//结点数据
LinkNodeT*link;
//结点链接指针
LinkNode(LinkNodeT*ptr=NULL){link=ptr;}
//构造函数
LinkNode(constTitem,LinkNodeT*ptr=NULL){data=item;link=ptr;}
templateclassT
classList{
protected:
structLinkNodeT*first;
public:
List(){first=newLinkNodeT}
//构造函数
List(constTx){first=newLinkNodeT}
//构造函数
List(ListTL);
//复制构造函数
~List(){makeEmpty();}
//析构函数
voidmakeEmpty();
//将链表置空
intLength()const;
//计算链表的长度
LinkNodeT*getHead()const{returnfirst;}
LinkNodeT*Search(Tx);
//搜素数据为x的节点
LinkNodeT*Locate(inti)const;
//搜索第i个元素的地址
boolgetData(inti,Tx)const;
//取出第i个节点的数据
voidsetData(inti,Tx);
//用x修改第i个元素的值
boolInsert(inti,Tx);
//在第i个节点后插入新节点
boolRemove(inti,Tx);
//删除第i个节点数据返回到x中
boolIsEmpty()const
//判断表是否为NULL
{
returnfirst-link==NULLtrue:false;
}
boolIsFull()const{returnfalse;}
//判断表满
voidInputFront(T
endFlag);
//倒序创建单链表
voidInputRear(TendFlag);
//正序创建单链表
voidOutput();
//输出
};
.cpp文件如下:
#include"LinkList.h"
#includeiostream
usingnamespacestd;
templateclassT
ListT::List(ListTL){
//复制构造函数
Tvalue;
LinkNodeT*srcptr=L.getHead();
LinkNodeT*destptr=first=newLinkNodeT
while(srcptr-link!=NULL){
//逐一赋值
value=srcptr-link-data;
destptr-link=newLinkNodeT(value);
destptr=destptr-link;
//左值游动指针移动到下一个
srcptr=srcptr-link;
//右值游动指针移动到下一个
}
destptr-link=NULL;
templateclassT
voidListT::makeEmpty(){
LinkNodeT
while(first-link!=NULL){
q=first-link;
first-link=q-link;
deleteq;
}
templateclassT
intListT::Length()const{
//计算带附加头节点的单链表的长度
LinkNodeT*p=first-link;
intcount=0;
while(p!=NULL){
count++;
p=p-link;
}
returncount;
templateclassT
LinkNodeT*ListT::Search(Tx){
//在表中搜索含数据x的节点,搜索成功时返回该节点的地址,否则返回NULL
LinkNodeT*current=first-link;
while(current!=NULL){
if(current-data==x)break;
elsecurrent=current-link;
}
returncurrent;
templateclassT
LinkNodeT*ListT::Locate(inti)const{
//定位函数返回表中第i个节点的地址如果i0或者i超过链表长度则返回NULL
if(i0)returnNULL;
LinkNodeT*current=first;
intm=0;
while(current!=NULLmi){
current=current-link;
m++;
}
returncurrent;
templateclassT
boolListT::getData(inti,Tx)const{
//取出链表中第i个节点的data
if(i=0)returnNULL;
//数据非法返回false
LinkNodeT*current=Locate(i);
//借助定位函数直接定位到相应的节点
if(current==NULL)returnfalse;
//i超过单链表的长度返回false
else{
x=current-data;
returntrue;
}
templateclassT
voidListT::setData(inti,Tx){
//设置链表的第i个元素为x
if(i=0)return;
LinkNodeT*current=Locate(i);
if(current==NULL)return;
elsecurrent-data=x;
templateclassT
boolListT::Insert(inti,Tx){
//在i个节点之后插入新节点
LinkNodeT*current=Locate(i);
if(NULL==current)returnfalse;
LinkNodeT*newNode=newLinkNodeT
if(NULL==newNode)
cout"存储分配错误"endl;
newNode-link=current-link;
current-link=newNode;
returntrue;
templateclassT
boolListT::Remove(inti,Tx){
//将链表中第i个节点删除删除成功返回true并将删除的data存储在x中
LinkNodeT*current=Locate(i-1);
//定位到指向i节点的节点
if(NULL==current||NULL==current-link)returnfalse;
//不存在待删除的节点
LinkNodeT*del=current-link;
//标记待删除的节点
current-link=del-link;
//重新拉链
x=del-data;
//记录下删除节点的data
deletedel;
//释放删除节点
returntrue;
templateclassT
voidListT::Output(){
//单链表的输出函数:将单链表中所有节点的data按逻辑顺序输出到屏幕上
LinkNodeT*current=first-link;
//创建遍历指针
while(current!=NULL){
coutcurrent-data'';
current=current-link;
}
coutendl;
templateclassT
voidListT::InputRear(TendFlag){
//函数功能:顺序建立单链表
//函数参数:输入结束标志的数据
LinkNodeT*newNode,*last;
//需要一个指针时刻标记结尾
Tval;
makeEmpty();
cinval;
last=first;
//首先令last指针指向头节点
while(val!=endFlag){
newNode=newLinkNodeT(val);
if(newNode==NULL)
cout"内存分配错误"endl;
last-link=newNode;
last=newNode;
cinval;
}
last-link=NULL;
intmain()
Listint
Listint
Listint
LinkNodeint*p,*q,*r;
cout"请输入第一个链表(结束符为0):";
x.InputRear(0);//以0作为结束符正序创建链表
cout"请输入第二个链表(结束符为0):";
y.InputRear(0);
p=x.getHead();
q=y.getHead();
r=z.getHead();
//新链表
q=q-link;
p=p-link;
cout"归并前的链表一:"endl;
x.Output();
cout"归并前的链表二:"endl;
y.Output();
while(pq)
{
if(p-data=q-data)
{
r-link=p;
r=p;
p=p-link;
continue;
}
if(p-dataq-data)
{
r-link=q;
r=q;
q=q-link;
continue;
}
}
if(p)
//归并后对元素个数多的链表的单独处理
{
while(p)
{
r-link=p;
r=p;
p=p-link;
}
}
if(q)
{
while(q)
{
r-link=q;
r=q;
q=q-link;
}
}
cout"归并后的链表为:"endl;
z.Output();
}
将两个有序链表合并为一个新的有序链表并返回
新链表是通过拼接给定的两个链表的所有节点组成的。
示例
输入:1-2-4,1-3-4
输出:1-1-2-3-4-4
/**
*Definitionforsingly-linkedlist.
*structListNode{
*
intval;
*
ListNode*next;
*
ListNode(intx):val(x),next(NULL){}
*};
classSolution{
public:
ListNode*mergeTwoLists(ListNode*l1,ListNode*l2){
ListNode*p=newListNode(0);
ListNode*temp=p;
while(l1||l2){
if(l1==NULL){
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 湖盐脱水工安全生产能力水平考核试卷含答案
- 珍珠岩焙烧工操作能力知识考核试卷含答案
- 绝缘成型件制造工岗前理论实践考核试卷含答案
- 剑麻栽培工安全意识评优考核试卷含答案
- 家畜饲养员岗位知识技能考核试卷含答案
- 塑料制品生产检验工安全生产知识评优考核试卷含答案
- 印染丝光工岗中团队合作考核试卷含答案
- 塑料制品烧结工安全规程测试考核试卷含答案
- 三氯氢硅还原工安全知识模拟考核试卷含答案
- 气体分馏装置操作工岗位技术改进考核试卷含答案
- 水果农药安全间隔期执行手册
- 软包墙面施工方案及技术措施
- 急诊科护理人员的血气分析解读
- 2025年闽侯县公安局招聘警务辅助人员真题
- 2025年安徽省《保密知识竞赛必刷100题》考试题库及答案详解【有一套】
- 2025年度新疆新星国有资本投资集团有限公司校园招聘5人笔试参考题库附带答案详解
- 脊髓电刺激护理
- 自愿收养协议书范本
- 新时代幼儿园教师职业行为十项准则培训
- 食品管理管理制度
- 市政工程工程简介
评论
0/150
提交评论