- 本文收录自【C语言数据结构】思想+代码集】
【数据结构】归并 非降序链表
思想
将链表A和B归并为C,且保持元素相对位置不变。
- 先定义三个指针pa,pb分别指向三个链表的头节点的下一个,pc指向新链表的第一个
- 判断pa的数值和pc的数值,小的那一个放在pc的下一个
时间复杂度(O(LA.length+LB.length))
空间复杂度比顺序表小
只需把之前两个链表的比较大小时候的节点链接成一个链表即可
代码
/*===============
* 归并非降序链表
*
* 包含算法: 2.12
================*/
#include "MergeList.h" //**▲02 线性表**//
/*
* ████████ 算法2.12 ████████
*
* 非递减链表归并:C=A+B
*
* 将链表A和B归并为C,且保持元素相对位置不变。
* Lc利用La的头结点,Lb中结点均插入新链表Lc中。
*/
void MergeList(LinkList* La, LinkList* Lb, LinkList* Lc) {
LinkList pa, pb, pc;
pa = (*La)->next;
pb = (*Lb)->next;
pc = *Lc = *La; // 用La的头结点作为Lc的头结点
// 遍历La和Lb
while(pa && pb) {
if(pa->data <= pb->data) {
pc->next = pa;
pc = pa;
pa = pa->next;
} else {
pc->next = pb;
pc = pb;
pb = pb->next;
}
}
// 插入剩余段
pc->next = pa ? pa : pb;
// 释放Lb的头结点所占内存
free(*Lb);
*La = NULL;
*Lb = NULL;
}