您的位置:首页 > 编程语言 > C语言/C++

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++ 算法 链表