2-3 两个有序链表序列的合并
分数 4
作者 DS课程组
单位 浙江大学
已知两个非降序链表序列S1与S2,设计函数构造出S1与S2合并后的新的非降序链表S3。
输入格式:
输入分两行,分别在每行给出由若干个正整数构成的非降序序列,用−1表示序列的结尾(−1不属于这个序列)。数字用空格间隔。
输出格式:
在一行中输出合并后新的非降序链表,数字间用空格分开,结尾不能有多余空格;若新链表为空,输出NULL。
输入样例:
输出样例:
依旧是第n遍写这个题(又敲了一遍)
答案
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
| #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) { LNode *newNode = new LNode; newNode->data = num; newNode->next = NULL; tail->next = newNode; tail = newNode; }
LinkList Merge(LinkList L, LinkList L1, LinkList L2) { LinkList p = L1->next; LinkList q = L2->next; LinkList tail = L; while (p != NULL && q != NULL) { if (p->data <= q->data) { insertAtTail(tail, p->data); p = p->next; } else { insertAtTail(tail, q->data); q = q->next; } } while (q != NULL) { insertAtTail(tail, q->data); q = q->next; } while (p != NULL) { insertAtTail(tail, p->data); p = p->next; } return L; }
void printList(LinkList L) { bool isFirst = true; LinkList p = L->next; if (p == NULL) { cout << "NULL"; return; } 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 < 0) { break; } insertAtTail(tail1, num); }
LinkList tail2 = L2; while (cin >> num) { if (num < 0) { break; } insertAtTail(tail2, num); }
LinkList L; initList(L); L = Merge(L, L1, L2); printList(L); }
|
一遍过!耶耶耶