1 #include <stdio.h>
2 #include <stdlib.h>
3
4 /**
5 * 【数据结构 C描述】有两个整数集合 A 和 B 分别用两个线性表 LA 和 LB 表示,
6 * 求:一个新的集合C=A∪B,C仍然为纯集合,线性表采用链式存储方式。
7 * 注:本算法中LA, LB为递增有序情况,无序的话可以考虑暴力
8 * 此情况下复杂度为o(m+n), m, n分别为LA, LB长度
9 **/
10 typedef struct node
11 {
12 int data;
13 struct node *next;
14 } LinkNode;
15
16 // 初始化链表
17 void init_list(LinkNode *&list)
18 {
19 list = (LinkNode *)malloc(sizeof(LinkNode));
20 list->next = NULL;
21 }
22
23 /**
24 * 链表中插入数据(尾插法)
25 * int sz[]为插入数据暂存数组, int len为数据个数
26 */
27 void create_list(LinkNode *list, int sz[], int len)
28 {
29 LinkNode *p = list, *temp = NULL;
30 for (int i = 0; i < len; i++)
31 {
32 temp = (LinkNode *)malloc(sizeof(LinkNode));
33 temp->data = sz[i];
34 p->next = temp;
35 p = p->next;
36 }
37 p->next = NULL;
38 }
39
40 // 将两集合LA, LB合并为LC返回, LA,LB中元素递增有序(忽略free()操作)
41 LinkNode *list_union_list(LinkNode *LA, LinkNode *LB)
42 {
43 LinkNode *LC = NULL, *temp = NULL, *p = LA->next, *q = LB->next, *r;
44 init_list(LC);
45 r = LC;
46 while (p && q)
47 {
48 if (p->data < q->data)
49 {
50 temp = (LinkNode *)malloc(sizeof(LinkNode));
51 temp->data = p->data;
52 r->next = temp;
53 p = p->next;
54 r = r->next;
55 }
56 else if (p->data > q->data)
57 {
58 temp = (LinkNode *)malloc(sizeof(LinkNode));
59 temp->data = q->data;
60 r->next = temp;
61 q = q->next;
62 r = r->next;
63 }
64 else
65 {
66 temp = (LinkNode *)malloc(sizeof(LinkNode));
67 temp->data = p->data;
68 r->next = temp;
69 p = p->next;
70 q = q->next;
71 r = r->next;
72 }
73 }
74 if (p) // 若p非空,即LA未遍历完,赋值给q
75 q = p;
76 while (q) // 遍历q,加到LC末尾
77 {
78 temp = (LinkNode *)malloc(sizeof(LinkNode));
79 temp->data = q->data;
80 r->next = temp;
81 q = q->next;
82 r = r->next;
83 }
84 r->next = NULL;
85 return LC;
86 }
87
88 // 主函数
89 int main()
90 {
91 LinkNode *LA = NULL, *LB = NULL, *LC = NULL, *p = NULL;
92 // 初始化
93 init_list(LA);
94 init_list(LB);
95 // 声明构造LA, LB链表的数组
96 int la[] = {1, 8, 11, 13, 19, 21, 55, 100, 101, 200};
97 int lb[] = {5, 8, 15, 26, 33, 69, 99, 100, 150, 200, 700, 999, 1024, 2048, 3333};
98 // 构造LA, LB链表
99 create_list(LA, la, 10);
100 create_list(LB, lb, 15);
101 // 求取交集
102 LC = list_union_list(LA, LB);
103 p = LC->next;
104 while (p) // 遍历集合LC输出结果
105 printf("%d ", p->data), p = p->next;
106 return 0;
107 }