C++经典算法————有序链表合并
2014-08-28 13:07
513 查看
有序链表合并
// addlist.cpp : 定义控制台应用程序的入口点。 // //有序链表合并 //算法示例 /////////////////////////////////////////■ ■ ■ ■ ■ /////////////////////////////////////////↑ /////////////////////////////////////////q1 /////////////////////////////////////////■ ■ ■ ■ ■ /////////////////////////////////////////↑ /////////////////////////////////////////q2 /////////////////////////////////////////如果q1小于q2,把q1合并到总链表的后面,然后q1=q1->next,如下图; /////////////////////////////////////////■ ■ ■ ■ ■ ////////////////////////////////////////////↑ ////////////////////////////////////////////q1 /////////////////////////////////////////■ ■ ■ ■ ■ /////////////////////////////////////////↑ /////////////////////////////////////////q2 /////////////////////////////////////////q1,q2在进行比较,如此循环,知道一个链表结束,然后把另一个链表接到总链表的后面 #include "stdafx.h" #include "iostream" using namespace std; //链表数据结构 struct Node { int data; Node * next; }; int _tmain(int argc, _TCHAR* argv[]) { Node * SortedMerge(Node * l1,Node * l2); Node * initList1(Node * t); Node * initList2(Node * t); //链表1和链表2初始化 Node * list1,* list2; list1=(Node*)malloc(sizeof(Node)); list2=(Node*)malloc(sizeof(Node)); list1=initList1(list1); list2=initList2(list2); Node * list; //合并 list=SortedMerge(list1,list2); system("pause"); return 0; } //链表1初始化 Node * initList1(Node * t) { Node * temp; temp=t; temp->data=-1; Node * q,* p; q=temp; for (int i=0;i<5;i++) { p=(Node*)malloc(sizeof(Node)); p->data=i*2; q->next=p; q=p; } q->next=NULL; cout<<"list1"<<endl; q=temp; do { cout<<q->data<<endl; q=q->next; } while (q); return temp; } //链表二初始化 Node * initList2(Node * t) { Node * temp; temp=t; temp->data=-1; Node * q,* p; q=temp; for (int i=0;i<5;i++) { p=(Node*)malloc(sizeof(Node)); p->data=i*2+1; q->next=p; q=p; } q->next=NULL; cout<<"list2"<<endl; q=temp; do { cout<<q->data<<endl; q=q->next; } while (q); return temp; } //合并 Node * SortedMerge(Node * l1,Node * l2) { //q1 存储链表1,q2存储链表2,head记录合并后链表的头部 Node * q1,*q2, *head; //list合并后的链表 Node * list; q1=l1; q2=l2; //两个链表中有一个为NULL,就返回另一个,两个都为NULL,就返回NULL if (!q1||!q2) { if (q1==NULL) { return q2; } else { return q1; } } //确定head从小到大排序 if (q1->data<=q2->data) { list=q1; head=q1; q1=q1->next; } else { list=q2; head=q2; q2=q2->next; } //比较大小 do { if (q1->data<=q2->data) { list->next=q1; q1=q1->next; list=list->next; } else { list->next=q2; q2=q2->next; list=list->next; } } while (q1&&q2); //一条链表结束时候,把另一条链表合并到总的链表尾部 if (q1==NULL) { list->next=q2; } else { list->next=q1; } //输出合并后的链表 cout<<"sumlist"<<endl; list=head; do { cout<<list->data<<endl; list=list->next; } while (list); return head; }
相关文章推荐
- 经典算法——合并两个有序链表
- C++实现两个有序链表合并(17)---《那些奇怪的算法》
- 经典算法学习——合并两个有序链表
- 经典算法——合并K个有序链表
- 合并两个有序链表 经典面试题
- 【C++实现有序子序列合并算法】
- 合并两个有序链表 经典面试题
- C++经典算法————链表倒序
- 算法:两个有序链表的合并
- 合并两个有序链表的算法
- C++模板数组实现有序数组的排列合并算法
- [小算法] 合并两有序链表
- 已知两个链表 la和 lb,其元素值递增排序。编程将la和lb合并成一个递减有序(相同值元素只保留一个)的链表lc。(北方名校经典试题) 本题选做
- 数据结构与算法之—链表(二) 有序单链表合并
- 经典算法与数据结构的c++实现——带头结点的单链表
- 合并有序链表C++
- 数据结构——算法之(033)(两个有序单链表合并为一个有序的单链表)
- 每天一个小算法(2)----合并两个有序链表
- 【LeetCode-面试算法经典-Java实现】【021-Merge Two Sorted Lists(合并两个排好序的单链表)】
- 【LeetCode-面试算法经典-Java实现】【023-Merge k Sorted Lists(合并k个排好的的单链表)】