仅供参考
#include <iostream>
using namespace std;
// 函数结果状态代码
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define MAXSIZE 100
// Status 是函数的类型 其值是函数结果状态代码
typedef int Status;
typedef int ElemType;
typedef struct ListNode{
ElemType data; // 数据域
struct ListNode *next; // 指针域
}ListNode, *LinkList;
// 单链表的初始化
Status InitList_L(LinkList &L){
L = new ListNode; // 生成新节点作头结点,用头指针L指向头结点
L->next = nullptr; // 将头结点的指针域置空
return OK;
}
// 尾插法:正序输入N个元素值,建立带头结点的单链表 算法复杂度O(n)
void CreatList_R(LinkList &L, int n){
L = new ListNode;
L->next = nullptr;
ListNode *r = L; // 尾指针r指向头节点
cout << "尾插法["<< n <<"]:";
for (int i = 0; i < n; ++i) {
auto p = new ListNode; // 生成新节点,输入元素值
cin >> p->data;
p->next = nullptr;
r->next = p; // 插入到表尾
r = p; // r 指向新的为结点
}
}
// 遍历链表
Status PrintList(LinkList L){
ListNode *p = L->next;
while (p){
cout << p->data << " ";
p = p->next;
}
cout << endl;
return OK;
}
// 有序表合并--用链表实现 时间复杂度O( ListLength(La)+ListLength(Lb) )
void MergeList_L(LinkList &La, LinkList &Lb, LinkList &Lc){
ListNode *pa, *pb, *pc;
Lc = pc = La; // 用La的头结点作为Lc的头结点
pa = La->next;
pb = Lb->next;
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; // 插入剩余段
delete Lb;
}
// 头插法测试代码
int main() {
// 创建一个空链表
LinkList La;
LinkList Lb;
LinkList Lc;
// 初始化链表
InitList_L(La);
InitList_L(Lb);
// 头插法
CreatList_R(La, 3);
CreatList_R(Lb, 6);
// 遍历链表
cout << "La: ";
PrintList(La);
cout << "Lb: ";
PrintList(Lb);
MergeList_L(La, Lb, Lc);
cout << "有序表合并Lc: ";
PrintList(Lc);
return 0;
}
测试:
尾插法[3]:1 7 8
尾插法[6]:2 4 6 8 10 11
La: 1 7 8
Lb: 2 4 6 8 10 11
有序表合并Lc: 1 2 4 6 7 8 8 10 11
感谢青岛大学-王卓老师细心的讲解~!