链表合并
2016-03-21 16:29
253 查看
已知两个链表head1 和head2 各自有序,请把它们合并成一个链表依然有序。
输出结果:
#include <stdio.h> #include <iostream> using namespace std; //已知有两个有序链表head1,head1,将它们合并成一个新的有序链表 typedef struct Node { int data; struct Node *next; }NODE; NODE* Merge(NODE *head1,NODE *head2) { //若链表head1为空,返回head2 if(head1==NULL) { return head2; } //若链表head2为空,返回head1 if(head2==NULL) { return head1; } NODE *head = NULL; NODE *p1 = NULL; NODE *p2 = NULL; //将数据最小的链表头给head,引入p1,p2进行指针的向后移动 if(head1->data <= head2->data) { head = head1; p1 = head1->next; p2 = head2; } else { head = head2; p1 = head1; p2 = head2->next; } NODE *pc = head; //current node while(p1!=NULL && p2!=NULL) { if(p1->data <= p2->data) { pc->next=p1; pc = p1; p1 = p1->next; } else { pc->next = p2; pc = p2; p2 = p2->next; } } if(p1!=NULL) { pc->next = p1; } else if(p2!=NULL) { pc->next=p2; } return head; } //链表的创建 NODE* Create(NODE p[],int n) { NODE *head = &p[0]; for(int i=0;i<n-1;i++) { p[i].next = &p[i+1]; } p[n-1].next = NULL; return head; } //链表的输出 void output(NODE *head) { NODE *p = head; int i = 0; while(p!=NULL) { printf("%d\t",p->data); p = p->next; if(++i%5==0) { printf("\n"); } } } int main() { NODE a[10] = {{1},{3},{4},{6},{8},{12},{15},{17},{19},{23}}; NODE b[5] ={{4},{5},{7},{10},{18}}; NODE *head1 = Create(a,10); NODE *head2 = Create(b,5); printf("原始链表head1是:\n"); output(head1); printf("\n原始链表head2是:\n"); output(head2); NODE *head =Merge(head1,head2); printf("\n合并后的链表head是:\n"); output(head); system("pause"); return 0; }
输出结果:
//递归 NODE* MergeRec(NODE *head1,NODE *head2) { //若链表head1为空,返回head2 if(head1==NULL) { return head2; } //若链表head2为空,返回head1 if(head2==NULL) { return head1; } NODE *head = NULL; if(head1->data<=head2->data) { head = head1; head->next = MergeRec(head1->next,head2); } else { head = head2; head->next = MergeRec(head1,head2->next); } return head; }
相关文章推荐
- [C/C++]反转链表
- 用VBScript写合并文本文件的脚本
- C#实现基于链表的内存记事本实例
- oracle列合并的实现方法
- 使用BAT一句话命令实现快速合并JS、CSS
- SQL 合并多行记录的方法总汇
- C#实现简单合并word文档的方法
- C#自适应合并文件的方法
- Node.js实现JS文件合并小工具
- C语言实现带头结点的链表的创建、查找、插入、删除操作
- C++实现简单的学生管理系统
- GridView单元格合并
- 如何合并多个 .NET 程序集
- 使用UglifyJS合并/压缩JavaScript的方法
- 高性能WEB开发 JS、CSS的合并、压缩、缓存管理
- 多个js与css文件的合并方法详细说明
- 使用不同的方法结合/合并两个JS数组
- Linux内核链表实现过程
- C++链表倒序实现方法
- C#通过链表实现队列的方法