C++经典算法————有序链表合并

来源:互联网 发布:linux 内存管理 书籍 编辑:程序博客网 时间:2024/05/21 22:33

有序链表合并

// 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,就返回NULLif (!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;}


0 0
原创粉丝点击