将两个有序链表合并成一个链表
代码实现功能如下:将两个有序链表合并成一个有序链表。
具体思路如下:首先自己调用链表的创建函数,手动创建两个有序链表,链表的创建以输入0作为截止标志。创建好两个有序链表之后,将两个链表的头结点进行比较,小的那个作为合并后的链表的头结点,同时,创建两个指针分别指向两个链表的的头结点或头结点的下一个节点,当两个链表进行比较的元素都不为空的话,依次从下到大连接,若有一个链表中比较的节点开始为空时,则将另一个链表的剩余节点添加到合并链表的末尾。
具体代码实现如下:
/*已知两个链表head1 和head2 各自有序,请把它们合并成一个链表依然有序。(保留所有结点,即便大小相同)
*/
#include <iostream>
using namespace std;
typedef struct Node
{int data;struct Node *next;
}Node;
Node* Merge(Node* head1, Node* head2) //合并两个有序链表成一个有序链表
{if(head1 == NULL)return head2;if(head2 == NULL)return head1;Node *head, *p1, *p2;if(head1->data < head2->data) //确定好合并后的头结点{head = head1;p1 = head1->next;p2 = head2;}else{head = head2;p1 = head1;p2 = head2->next;} Node *move = head; //定义一个移动指针,将两个链表连接在一起while(p1 && p2){if(p1->data <= p2->data){move->next = p1;move = p1;p1 = p1->next;}else if(p1->data > p2->data){move->next = p2;move = p2;p2 = p2->next;}}if(p1)move->next = p1; // 补齐p1剩余未比较的节点if(p2)move->next = p2; // 补齐p2剩余未比较的节点return head;
}
Node* Creat() //链表的创建
{Node *head,*p,*s;head = new Node;if(head == NULL)printf("头结点创建失败!\n");p = head;int x;char cycle = 1;while(cycle){printf("please input a number:\n");cin >> x;if(x != 0){s = new Node;s->data = x;p->next = s;p = s; }elsecycle = 0; }head = head->next;p->next = NULL;printf("链表建立成功!\n"); return head;
}
void Print(Node *head)
{Node *p = head;while(p){printf("%d ",p->data);p = p->next;}printf("\n");
}
int main()
{Node *head1 = Creat();Node *head2 = Creat();Node *head3 = Merge(head1, head2);Print(head3);return 0;
}
此外,还可以通过另外一种思路来解决该问题,实现两个有序链表的合并:首先,将两个链表直接合并成一个链表(未经排序的,直接链表1的尾节点指向链表2的第一个结点,当然这两者都是不带头结点的链表),然后,对链表中节点的元素进行排序就行啦,最小的节点值放在第一个吧节点里,以此类推。则可以实现两个有序链表合并成一个有序链表的目的。
将两个有序链表合并成一个链表相关推荐
- 顺序表:将两个有序表合并成一个新的有序顺序表
题目:将两个有序表合并成为一个新的有序顺序表,并由函数返回结果顺序表. 算法思想:假设有AB两个顺序表,要使得合并后仍然有序,因此可以将AB中对应的数作比较,把较小的放入C中,比完之后将剩下的依次放入 ...
- 将两个有序数组合并成一个有序数组
将两个有序数组按从小到大顺序合并成一个数组. #include<iostream> using namespace std; int main() {int a[5]={1,5,6,8,9 ...
- Coding:两个从大到小的有序链表合并成一个从小到大有序链表
要求 请实现一个函数,把两个从大到小的有序链表合并成一个链表,新的链表是一个从小到大的有序链表. struct list {int value;list* next; }; list * merge ...
- 两个有序链表合并成一个有序的单链表
将这两个有序链表合并成一个有序的单链表 要求结果链表仍使用原来两个链表的存储空间,不另外占用其它的存储空间 表中允许有重复数据 算法描述 (1)定义一个合并后的指针pc指向La表的头结点.由于要求不占 ...
- 将两个有序链表合并为一个链表任然有序C语言
将两个有序链表合并为一个链表任然有序,两个链表都是从大到小或者从小到大. 方法: 1.将两个链表连起来,对所有元素进行排序. 2.因为两个链表的长度可能不同,则将两链表相同长度的一部分进行排序,将较长 ...
- 将k个有序链表合并成一个有序链表
将k个有序链表合并成一个有序链表 这里以从小到大排序为例, 时间复杂度为O(nlgk). 特点:利用最小堆来完成k路归并 思路:取每个列表中的第一个元素,并将其放在最小堆中.与每个元素一起,必须跟踪从 ...
- 将两个双向循环链表合并成一个双向循环链表
将两个双向循环链表合并成一个双向循环链表只要重点操作链表的头和尾结点即可,这样充分利用了链表动态分配的特点.一个是双向循环链表A的头结点和尾结点,另一个是双向循环链表B的首结点和尾结点,只要这4个结点 ...
- ZZULIOJ 1124: 两个有序数组合并
两个有序数组合并 题目描述 已知数组a中有m个按升序序排列的元素,数组b中有n个降序排列的元素,编程将a与b中的所有元素按降序存入数组c中. 输入 输入有两行,第一行首先是一个正整数m,然后是m个整数 ...
- 用c语言编写两个有序数组合并,C++实现两个有序数组的合并
本文实例为大家分享了C++实现两个有序数组合并的具体代码,供大家参考,具体内容如下 剑指offer面试题5延展题: 问题:有两个排序的数组A1和A2,内存在A1的末尾有足够多的空间容纳A2.请实现一个 ...
最新文章
- POJ 2096 (概率DP)
- XShell+Xmanager实现在XShell中显示远程服务器的图形界面
- 添加/移除事件处理程序
- 【PHP】多线程请求 curl_multi_init()
- Dubbo 3.0 前瞻之对接 Kubernetes 原生服务
- system函数和fork-exec机制
- 目标检测之选择性搜索-Selective Search
- 跟我一起屏蔽百度搜索页面右侧的内容
- 关于exprot 和expert default的区别
- ssh 配置文件中 maxsessions 与 MaxStartups
- oracle用户密码规则,使用Oracle自带profile以及函数简单设定Oracle用户名密码规则...
- spring mvc 实现websocket(服务器主动消息推送)
- 【源码】基于MPPT的光伏(PV)系统仿真
- vscode unins000.exe报错
- 弱小目标检测领域下图像的信噪比(SNR)计算方法
- 计算机专业师范类毕业论文,师范生毕业论文范文
- 14、文件的上传和下载
- 化合物相似性搜索_SCIFINDER相似结构搜索教程
- Tools-06 WinDbg快速入门使用——查找蓝屏原因,解决蓝屏!
- 淘宝商品信息爬取(已登录)