• 编程菜鸟的日记-初学尝试编程-易传媒笔试题(C++实现)


    题目:已知存在两个非递减的有序链表List1和List2,现在需要你将两个链表合并成一个有序的非递增序列链表List3,请用C++编码实现。(所有链表均为单链表结构)

    思路:此处链表是否都有表头并没有规定。

             1:将链表List1和List2合并成一个非递减有序链表List3;

             2:再将链表List3进行逆序,即可。

    #include <iostream>
    using namespace std;
    typedef int ElemType;
    typedef struct LNode
    {
     ElemType data;
     struct LNode *next;
    }LinkList;
    //采用尾插法创建表
    void CreateListR(LinkList *&L,ElemType a[],int n)
    {
     LinkList *s,*r;//将数组中的数值存在结点s,再插入到链表L中
     int i;
     L=(LinkList *)malloc(sizeof(LinkList));//链表L头结点
     r=L;//起初指向链表头结点
     for(i=0;i<n;i++)
     {
      s=(LinkList *)malloc(sizeof(LinkList));
      s->data=a[i];
      r->next=s;
      r=s;
     }
     r->next=NULL;//结束标识
    }

    LinkList *Merge(LinkList *&L1,LinkList *&L2)
    {
     if(L2==NULL)
      return L1;
     if(L1==NULL)
      return L2;
     LinkList *L3;
     //L3=(LinkList *)malloc(sizeof(LinkList));
     if(L1->data<=L2->data)
     {
      L3=L1;
      L3->next=Merge(L1->next,L2);
     }
     else
     {
      L3=L2;
      L3->next=Merge(L1,L2->next);
     }
     return L3;
    }

    LinkList *ListReverse(LinkList *&L)
    {
     LinkList *s,*q,*p;
     //s指向逆序后的链表中的当前元素,q指向待逆序链表的当前元素,p指向待逆序链表中当前结点的下一个结点
     if(L==NULL||L->next==NULL)
      return L;
     else
     {
      //s=L;//以链表无头结点的逆序
      s=L->next;//s指向链表头结点的下一个结点
      p=s->next;
      s->next=NULL;
      while(p)
      {
       q=p->next;
       p->next=s;
       s=p;
       p=q;
      }
      //L=s;//p为NULL,s指向逆序元素的当前元素,即链表的第一个元素(若链表无表头,则注释掉这句)
            L->next=s;//若有,链表头结点下一个指向s
     }
     return L;
    }
    void DispList(LinkList *&L)
    {
     LinkList *p=L->next;
     while(p)
     {
      cout<<p->data<<" ";
      p=p->next;
     }
     cout<<endl;
    }
    int main()
    {
     ElemType a1[3]={1,2,3};
     ElemType a2[3]={2,3,4};
     LinkList *L1,*L2;
     int n=3;
     CreateListR(L1,a1,n);
        CreateListR(L2,a2,n);
     DispList(L1);
     DispList(L2);
        LinkList *L3;
     //L3=(LinkList *)malloc(sizeof(LinkList));
     L1=L1->next;//除去头结点
     //L2=L2->next;//除去头结点
        L3=Merge(L1,L2);//以链表1的头结点开始
     DispList(L3);
     L3=ListReverse(L3);
     DispList(L3);
     system("pause");
     return 0;
    }

  • 相关阅读:
    【Todo】Java线程面试题 Top 50 (转载)
    【Todo】秒杀系统 & 乐观锁 & Nginx反向代理
    【Todo】C++和Java里面的浮点数及各种数字表示
    asp.net操作word的表格
    Android消息推送(二)--基于MQTT协议实现的推送功能
    单点更新线段树 RMQ
    英语月结
    AppWidget应用(二)---PendingIntent 之 getActivity
    2 WAN 和1 Evo/3g Routeros PCC 方法负载平衡
    Android 网络权限配置
  • 原文地址:https://www.cnblogs.com/lynnycy/p/lynn.html
Copyright © 2020-2023  润新知