思路:另外新建一个独立的链表作为合并的结果。设置两个指针,分布从两个表头开始,依次向后移动,并不断比较他们所指的元素的大小关系,每次把比较小的结点复制到新的循环链表中。
时间复杂度:每个结点访问一次,时间代价为O(n)。其中,n为链表list1和list2长度的最大值。
程序代码:
LinkList combine_clink(LinkList list1,LinkList list2)
{
LinkList list3 = (LinkList)malloc(sizeof(struct Node));
PNode p1 = list1->link,p2 = list2->link,p3 = list3;
if(p1 == list1 && p2 == list2) //如果list1和list2都是空表,则让空表头结点的指针指向头结点自己
{
list3->link = list3;
return list3;
}
while(p1 != list1 || p2 != list2)
{
p3->link = (PNode)malloc(sizeof(struct Node));
p3 = p3->link;
if(p2 == list2 || (p1 != list1 && p1->info <= p2->info))
//如果list2已搜索完毕,或者list1的当前元素不大于链表list2的当前元素
{
p3->info = p1->info;
p1 = p1->link;
}
else
//如果list1已搜索完毕,或者链表list1的当前元素大于链表list2的当前元素
{
p3->info = p2->info;
p2 = p2->link;
}
}
p3->link = list3;
return list3;
}