有序链表合并
// 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;
}