剑指Offer - 九度1519 - 合并两个排序的链表

剑指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 }

 

你可能感兴趣的:(排序)