剑指Offer - 九度1519 - 合并两个排序的链表
2013-11-30 22:04
- 题目描述:
-
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
(hint: 请务必使用链表。)
- 输入:
-
输入可能包含多个测试样例,输入以EOF结束。
对于每个测试案例,输入的第一行为两个整数n和m(0<=n<=1000, 0<=m<=1000):n代表将要输入的第一个链表的元素的个数,m代表将要输入的第二个链表的元素的个数。
下面一行包括n个数t(1<=t<=1000000):代表链表一中的元素。接下来一行包含m个元素,s(1<=t<=1000000)。
- 输出:
-
对应每个测试案例,
若有结果,输出相应的链表。否则,输出NULL。
- 样例输入:
-
5 2 1 3 5 7 9 2 4 0 0
- 样例输出:
-
1 2 3 4 5 7 9 NULL
题意分析:
合并链表,面试必考的题目。写的时候以下三个原则:
1. NULL一定要检查到位,否则会被鄙视
2. 合并链表要把原链表的节点拼成一条,而不是new出一堆新的节点,否则会被严重鄙视
3. 可以new出一个节点指向表头,这样能省点代码量。但对于频繁调用的函数,一次多余的new、delete都不应该有。
下面是ac的代码,当时写的时候貌似偷懒了...,第三条没做到。时间复杂度O(m + n),空间复杂度O(1)。
1 // 651961 zhuli19901106 1519 Accepted 点击此处查看所有case的执行结果 1024KB 1802B 230MS 2 // 201311152213 3 #include <cstdio> 4 using namespace std; 5 6 struct Node{ 7 int val; 8 struct Node *next; 9 Node(int _val = 0): val(_val), next(NULL){} 10 }; 11 12 int main() 13 { 14 int n, m; 15 int i, tmp; 16 struct Node *h1, *h2, *h3; 17 struct Node *p1, *p2, *p3; 18 struct Node *r1, *r2, *r3; 19 20 while(scanf("%d%d", &n, &m) == 2){ 21 if(n <= 0 && m <= 0){ 22 printf("NULL "); 23 continue; 24 } 25 r1 = new Node(0); 26 r2 = new Node(0); 27 r3 = new Node(0); 28 29 p1 = r1; 30 for(i = 0; i < n; ++i){ 31 scanf("%d", &tmp); 32 p1->next = new Node(tmp); 33 p1 = p1->next; 34 } 35 h1 = r1->next; 36 37 p2 = r2; 38 for(i = 0; i < m; ++i){ 39 scanf("%d", &tmp); 40 p2->next = new Node(tmp); 41 p2 = p2->next; 42 } 43 h2 = r2->next; 44 45 p3 = r3; 46 while(h1 != NULL && h2 != NULL){ 47 if(h1->val < h2->val){ 48 p1 = h1->next; 49 p3->next = h1; 50 p3 = p3->next; 51 p3->next = NULL; 52 h1 = p1; 53 }else{ 54 p2 = h2->next; 55 p3->next = h2; 56 p3 = p3->next; 57 p3->next = NULL; 58 h2 = p2; 59 } 60 } 61 62 while(h1 != NULL){ 63 p1 = h1->next; 64 p3->next = h1; 65 p3 = p3->next; 66 p3->next = NULL; 67 h1 = p1; 68 } 69 70 while(h2 != NULL){ 71 p2 = h2->next; 72 p3->next = h2; 73 p3 = p3->next; 74 p3->next = NULL; 75 h2 = p2; 76 } 77 78 h3 = r3->next; 79 printf("%d", h3->val); 80 p3 = h3->next; 81 while(p3 != NULL){ 82 printf(" %d", p3->val); 83 p3 = p3->next; 84 } 85 printf(" "); 86 87 while(r3->next != NULL){ 88 p3 = r3->next; 89 r3->next = p3->next; 90 delete p3; 91 } 92 93 delete r1; 94 delete r2; 95 delete r3; 96 r1 = r2 = r3 = NULL; 97 } 98 99 return 0; 100 }