算法采用存储结构为链式存储结构中的带头结点的单链表;
首先采用冒泡排序算法将两链表进行排序,时间复杂度分别为为O(n12)和 O(n22);后将链表连接时间复杂度为O(n12+ n22),较比之先插入后排序的时间复杂度O((n1+ n2)2)
建立L3结点过程:
归并结点的流程图:
归并链表实验代码:
void MergeList_L(LinkList& L1, LinkList& L2, LinkList& L3) {
LinkList p3;
listSort(L1);
listSort(L2); //对先对L1,L2进行冒泡排序
LinkList p1 = L1->next;
LinkList p2 = L2->next; //p1,p2的初值指向两个表的第一个结点
L3 = L1; //用L1的头结点作为L3的头结点
p3 = L3; //p3的初值指向L3的头结点
while(p1&&p2){ //L1和L2均到达表尾退出循环,循环体中代码为依次“摘取”两表中较小的结点插入L3的表尾
if (p1->data <= p2->data) {//if循环内代码为“摘取”p1结点至L3表尾
p3->next = p1; // p1所指结点链接到至p3所指结点之后
p3 = p1; // p3指向p1
p1 = p1->next; // p1指向下一个结点
}else { //else循环内代码为“摘取”p2结点至L3表尾
p3->next = p2; // p2所指结点链接到至p3所指结点之后
p3 = p2; // p3指向p2
p2 = p2->next; // p2指向下一个结点
}
}
p3->next = p1 ? p1 : p2; //将非空表的剩余段插入到p3所指结点之后
delete L2; //释放L2的头结点
}
冒泡排序算法:
//表排序冒泡排序
void listSort(LinkList& L) {
if ((L->next == NULL) || (L->next->next == NULL))
{
return;
}
LinkList head, pre, cur, next, end, temp;
head=L;
end = NULL;
while (head->next != end) {
for (pre = head, cur = pre->next, next = cur->next; next != end; pre = pre->next, cur = cur->next, next = next->next)
{
//相邻的节点比较
if (cur->data > next->data)
{
cur->next = next->next;
pre->next = next;
next->next = cur;
temp = next;
next = cur;
cur = temp;
}
}
end = cur;
}
}