2-6 两个有序链表合并(新表不含重复元素)
分数 4
作者 陈晓梅
单位 广东外语外贸大学
已知两个非降序链表序列S1与S2,设计函数构造出S1与S2合并后的新的非降序链表S3。
要求S3中没有重复元素。
输入格式:
输入分两行,分别在每行给出由若干个正整数构成的非降序序列,用−1表示序列的结尾(−1不属于这个序列)。数字用空格间隔。
输出格式:
在一行中输出合并后新的非降序链表,要求链表中没有重复元素。数字间用空格分开,结尾不能有多余空格;若新链表为空,输出NULL。
输入样例:
在这里给出一组输入。例如:
1 2
| 1 3 3 5 8 -1 2 3 4 6 8 10 -1
|
输出样例:
在这里给出相应的输出。例如:
我的正确答案
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
| #include<iostream> using namespace std;
typedef struct LNode { int data; struct LNode *next; } LNode, *LinkList;
void initList(LinkList &L) { L = new LNode; L->next = NULL; }
void insertAtTail(LinkList &tail, int num) { LinkList newNode = new LNode; newNode->data = num; newNode->next = NULL; tail->next = newNode; tail = newNode; }
void merge(LinkList &L, LinkList &L1, LinkList &L2) { int Max_size = 10000; bool exists[Max_size]; for (int i = 0; i < Max_size; ++i) { exists[i] = false; }
LinkList p = L1->next; LinkList q = L2->next; LinkList tail = L; while (p != NULL && q != NULL) { if (p->data <= q->data) { if (!exists[p->data]) { insertAtTail(tail, p->data); } exists[p->data] = true; p = p->next; } else { if (!exists[q->data]) { insertAtTail(tail, q->data); } exists[q->data] = true; q = q->next; } } while (q != NULL) { if (!exists[q->data]) { insertAtTail(tail, q->data); } exists[q->data] = true; q = q->next; } while (p!= NULL) { if (!exists[p->data]) { insertAtTail(tail, p->data); } exists[p->data] = true; p = p->next; } }
void printList(LinkList L) { bool isFirst = true; LinkList p = L->next; if (L->next == NULL) { cout << "NULL"; } while (p != NULL) { if (!isFirst) { cout << " "; } isFirst = false; cout << p->data; p = p->next; } }
int main() { LinkList L1; LinkList L2; initList(L1); initList(L2);
int num; LinkList tail1 = L1; while (cin >> num) { if (num == -1) { break; } insertAtTail(tail1, num); } LinkList tail2 = L2; while (cin >> num) { if (num == -1) { break; } insertAtTail(tail2, num); } LinkList L; initList(L); merge(L, L1, L2); printList(L); }
|