剑指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\n");
 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("\n");
 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 }

 

 posted on 2013-11-30 22:05  zhuli19901106  阅读(301)  评论(0编辑  收藏  举报