参考答案和解析
参考答案:
  合并后的新表使用头指针Lc指向,pa和pb分别是链表La和Lb的工作指针,初始化为相应链表的第一个结点,从第一个结点开始进行比较,当两个链表La和Lb均为到达表尾结点时,依次摘取其中较小者重新链接在Lc表的表头结点之后,如果两个表中的元素相等,只摘取La表中的元素,保留Lb表中的元素。当一个表到达表尾结点,为空时,将非空表的剩余元素依次摘取,链接在Lc表的表头结点之后。
  [算法描述]
  void MergeList(LinkList& La, LinkList& Lb, LinkList& Lc, )
  {//合并链表La和Lb,合并后的新表使用头指针Lc指向
  pa=La->next; pb=Lb->next;
  //pa和pb分别是链表La和Lb的工作指针,初始化为相应链表的第一个结点
  Lc=pc=La; //用La的头结点作为Lc的头结点
  Lc->next=NULL;
  while(pa||pb )
  {//只要存在一个非空表,用q指向待摘取的元素
  if(!pa) {q=pb; pb=pb->next;}
  //La表为空,用q指向pb,pb指针后移
  else if(!pb) {q=pa; pa=pa->next;}
  //Lb表为空,用q指向pa,pa指针后移
  else if(pa->data<=pb->data) {q=pa; pa=pa->next;}
  //取较小者(包括相等)La中的元素,用q指向pa,pa指针后移
  else {q=pb; pb=pb->next;}
  //取较小者Lb中的元素,用q指向pb,pb指针后移
  q->next = Lc->next; Lc->next = q;
  //将q指向的结点插在Lc 表的表头结点之后
  }
  delete Lb; //释放Lb的头结点
  }
更多“将两个非递减的有序链表合并为一个非递增的有序链表。要求结果链表仍使用原来两个链表的存储空间, 不另外占用其它的存储空间。表中允许有重复的数据。 ”相关问题
  • 第1题:

    2、下列叙述中错误的是()

    A.循环链表中有一个表头结点

    B.循环链表的存储空间是连续的

    C.循环链表的表头指针与循环链表中最后一个结点的指针均指向表头结点

    D.循环链表实现了空表与非空表运算的统—


    B 解析:二叉链表是二叉树的一种存储结构;循环队列是队列的一种存储结构,而队列属于线性表,因此,循环队列也是线性表;带链的队列是队列的一种存储结构.因此,选项A),C)、D)都是正确的。循环链表是一般线性表的一种链式存储结构,它不是循环队列的存储结构。因此,选项B)中的说法是错误的。

  • 第2题:

    试设计一个结点数据类型为整型的带表头结点的有序单链表,然后设计一个算法,该算法将这个有序单链表划分成两个单链表,使得第一个单链表中包含原单链表中所有数值为奇数的结点,第二个单链表中包含原单链表中所有数值为偶数的结点,且两个单链表中结点的相对排列顺序与原单链表中相同。 【要求】要求使用原单链表的空间,表头结点可以另辟空间。 【提示】请先在自己的稿纸上作答,然后将全部答题过程及所得结果拍照,以图片形式作为附件上传。请确保照片中的字迹足够清晰、解答过程完整。


    D解析:若要删除结点需要改变尾指针的指向。

  • 第3题:

    1、有两个递增有序表,所有元素为整数,均采用带头结点的单链表存储,结点类型定义如下: typedef struct node { int data; struct node *next; } LinkNode; 设计一个尽可能高效的算法,将两个递增有序单链表ha、hb合并为一个递减有序单链表hc,要求算法空间复杂度为O(1)。


    A

  • 第4题:

    有一个非空有序单链表L(元素从小到大排列),设计一个算法向该单链表中插入一个元素为x的节点,使插入后该链表仍然有序。


    可以是子表或原子

  • 第5题:

    【论述题】假设有两个按元素值非递减次序排列的线性表,均以单链表形式存储。请编写算法将这两个单链表归并为一个按元素值非递增次序排列的单链表,并要求利用原来两个单链表的结点存放归并后的单链表。