• 每天一个小算法(2)----合并两个有序链表


    每天一个小算法还是有点没时间,尽量抽出时间写一写。

    今天是合并有序的链表,对单链表有点忘了,尤其是指针指来指去的,有点晕,幸好基础还算好,想了想还是能想回来。

    代码使用随机数函数生成一个链表,然后对链表排序,最后合并链表并打印,删除链表的函数于算法无关紧要,所以未实现^_^。

    在Linux/g++下编译运行成功。

    合并思路:和合并数组有些类同,比较两个节点的元素大小然后将小的摘下来尾插到链表bList中,然后指针指向下一个节点,最后直接把非空的链表合并到bList的末尾。

      1 #include <stdio.h>
      2 #include <time.h>
      3 #include <stdlib.h>
      4 typedef struct Node
      5 {
      6     int data;
      7     Node* next;
      8 }Node, *List;
      9 
     10 void sortList(List aList) //对随机数字链表排序
     11 {
     12     if(aList == NULL)
     13         return;
     14 
     15     List pT = aList->next;
     16     aList->next = NULL;
     17     while ( pT != NULL )
     18     {
     19         List pr = pT;
     20         List pU = pT;
     21         List pN = NULL;
     22         while ( pU->next != NULL )
     23         {
     24             if ( pr->data <= pU->next->data )
     25             {
     26                 pN = pU;
     27                 pr = pU->next;
     28             }
     29 
     30             pU = pU->next;
     31         }
     32 
     33         if ( pN != NULL )
     34         {
     35             pN->next = pr->next;        
     36         }
     37         else
     38         {
     39             pT = pT->next;
     40         }
     41         pr->next = aList->next;
     42         aList->next = pr;
     43     }
     44 }
     45 
     46 List createList(int num) //随机生成数字,构造链表
     47 {
     48     List aList = (List)malloc(sizeof(Node));
     49     aList->next = NULL;
     50     aList->data = 0;
     51     Node* qT = aList;
     52 
     53      // srand((int)time(0));
     54      for ( int i=0; i< num; ++i)
     55      {
     56          Node* pTN = (Node*)malloc(sizeof(Node));
     57          pTN->data = rand()%100;
     58          pTN->next = NULL;
     59          qT->next = pTN;
     60          qT = pTN;
     61      }
     62      sortList(aList);
     63      return aList;
     64 }
     65 
     66 void printList(List aList)    //打印链表
     67 {
     68     if ( aList == NULL || aList->next == NULL )
     69         return;
     70 
     71     Node* pT = aList->next;
     72     printf("element of list:
    	");
     73     while( pT != NULL )
     74     {
     75         printf("%d ", pT->data);
     76         pT = pT->next;
     77     }
     78 
     79     printf("
    ");
     80 }
     81 
     82 void deleteList(List aList)    //删除链表
     83 {}
     84 
     85 void mergeList(List aList, List bList)    //合并链表
     86 {
     87     if ( aList == NULL || bList == NULL )
     88         return;
     89 
     90     Node* pA = aList->next;
     91     Node* pB = bList->next;
     92     Node* pT = NULL;
     93     Node* pN = bList;
     94     bList->next = NULL;
     95     delete aList;
     96 
     97     while ( pA != NULL && pB != NULL )
     98     {
     99         if ( pA->data < pB->data )
    100         {
    101             pT = pA->next;
    102             pA->next = pN->next;
    103             pN->next = pA;
    104             pN = pN->next;
    105             pA = pT;
    106         }
    107         else
    108         {
    109             pT = pB->next;
    110             pB->next = pN->next;
    111             pN->next = pB;
    112             pN = pN->next;
    113             pB = pT;    
    114         }
    115     }
    116 
    117     if ( pA == NULL )
    118     {
    119         pN->next = pB;
    120     }
    121 
    122     if ( pB == NULL )
    123     {
    124         pN->next = pA;
    125     }
    126 }
    127 
    128 int main(int argc, char const *argv[])
    129 {
    130      srand((int)time(0));
    131     List aList = createList(5);
    132     List bList = createList(7);
    133     printList(aList);
    134     printList(bList);
    135 
    136     mergeList(aList, bList);
    137     printList(bList);
    138 
    139     deleteList(bList);
    140     
    141     return 0;
    142 }
  • 相关阅读:
    HBase导入数据同时与Phoenix实现同步映射
    Hive导入数据到HBase,再与Phoenix映射同步
    CDH5.16.1离线集成Phoenix
    设计原则学习笔记
    Maven安装配置
    SpringBoot之Mybatis操作中使用Redis做缓存
    Linux服务器防火墙白名单设置
    Linux查看端口占用情况,并强制释放占用的端口
    shell脚本切割tomcat日志文件
    mysql读写分离
  • 原文地址:https://www.cnblogs.com/yrpen/p/3783490.html
Copyright © 2020-2023  润新知