• 剑指Offer


    剑指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 }
  • 相关阅读:
    PHP基础之文件的上传与下载
    PHP封装 文件上传
    PHP基础之文件操作
    Session案例:实现用户登录
    PHP基础之会话技术
    PHP基础之超全局变量
    PHP基础之HTTP协议
    PHP基础之错误处理及调试
    PHP基础之包含文件
    剑指offer-复杂链表的复制
  • 原文地址:https://www.cnblogs.com/zhuli19901106/p/3451823.html
Copyright © 2020-2023  润新知