• 将两个有序链表合并,合并后仍然有序


    思路:因为A,B链表中元素递增有序,要使归并后的C也递增有序,可以每次从A、B中挑出最小的元素插入C的尾部,这样循环插入完成后,C也一定是递增有序的。

    需要注意的点是,A、B中的元素有可能一个已经全部被插入到C中,而另一个还没插完。

     1 struct LNode{
     2     int data;
     3     LNode *next;
     4 }
     5 
     6 void Merge(LNode *A,LNode *B,LNode *&C)
     7 {
     8     LNode *p = A->next;    // 定义p结点跟踪 A中的结点
     9     LNode *q = B->next;    // 定义q结点跟踪 B中的结点
    10 
    11     C = A;
    12     C->next = NULL;
    13     free(B);
    14     
    15     LNode *r = C;   //  定义一个跟踪结点,永远指向C的终端结点
    16     
    17     while(p!=NULL&&q!=NULL){
    18         if(p->data <= q->data){
    19             r->next = p;
    20             p = p->next;
    21             r = r->next;
    22         }else{
    23             r->next = q;
    24             q = q->next;
    25             r = r->next;
    26         }
    27     }
    28 
    29     if(p!=NULL) r->next = p;
    30     if(q!=NULL) r->next = q;
    31 }

    如果题这样改:A、B递增有序,合并成C后,C递减有序,怎么做?    前面题用的是尾插法插入元素,如果使用头插法插入元素,就可以得到一个递减序列。

     1 struct LNode{
     2     int data;
     3     LNode *next;
     4 }
     5 
     6 void merge(LNode *A,LNode *B,LNode *&C)
     7 {
     8     LNode *p = A->next;
     9     LNode *q = B->next;
    10     LNode *s;
    11     C = A;  // 使用A的头结点作为C的头结点,然后建立一个空链表
    12     C->next= NULL;  
    13     free(B);  // 释放B的头结点
    14 
    15     while(p!=NULL&&q!=NULL){
    16         if(p->data<=q->data){
    17                 s = p;
    18                 p = p->next;
    19                 s->next = C->next;
    20                 C->next = s;
    21                }else{
    22                 s = q;
    23                 q = q->next;
    24                 s->next = C->next;
    25                 C->next = s;
    26                }
    27         }
    28         while(p!=NULL){
    29             s = p;
    30             p = p->next;
    31             s->next = C->next;
    32             C->next = s;
    33         }
    34         while(q!=NULL){
    35             s = q;
    36             q = q->next;
    37             s->next = C->next;
    38             C->next = s;
    39         }
    40 }
  • 相关阅读:
    经典背景音乐集(转)
    商业模式的思考
    PHP5.4的变化关注What has changed in PHP 5.4.x
    yii模版中的写法
    设计模式(一)工厂模式Factory(创建型)
    yii模版中的判断方法
    Yacc 与 Lex 快速入门(词法分析和语法分析)
    Windows PHP 中 VC6 X86 和 VC9 X86 的区别及 Non Thread Safe 的意思
    金融系列1《借贷记卡介绍》
    设计模式概论
  • 原文地址:https://www.cnblogs.com/ll-10/p/9698815.html
Copyright © 2020-2023  润新知