408王道数据结构课后代码习题(XIV)

简介: 408王道数据结构课后代码习题(XIV)

15


image.png


  • 跟上一题差不多,只是不让存入新链表,思路还是一样的
  • 我们只需要把A链表当作一个新链表,记录A链表的尾结点,然后每次尾插就可以了
  • 这就是归并的思想,同步遍历两个链表
  • 时间复杂度O(n),空间复杂度O(1)


void getSame(LinkList A, LinkList B) {
  // 1.创建工作指针
  LNode *pa = A->next, *pb = B->next, *tail = A;
  // 2.同步遍历
  while (pa != NULL && pb != NULL) {
    if (pa->data < pb->data) {
      pa = pa->next;
    } else if (pa->data > pb->data) {
      pb = pb->next;
    } else {
      // 3.找到相等结点就尾插
      tail->next = pa;
      tail = pa;
      pa = pa->next;
      pb = pb->next;
    }
  }
}
复制代码


  • 题中没有要求释放结点,如果要求的话需要在每个 if 分支释放多余结点
  • 最后收尾,将结果链表尾指针置为NULL
  • 通常清空会剩下一个非空链表,释放剩余空间
  • 最后释放B链表头结点


void getSame2(LinkList A, LinkList B) {
  LNode *pa = A->next, *pb = B->next, *tail = A, *del;
  while (pa != NULL && pb != NULL) {
    if (pa->data < pb->data) {
      del = pa;
      pa = pa->next;
      free(del);
    } else if (pa->data > pb->data) {
      del = pb; 
      pb = pb->next;
      free(del);
    } else {
      tail->next = pa;
      tail = pa;
      pa = pa->next;
      del = pb;
      pb = pb->next;
      free(del);
    }
  }
  // 收尾
  tail->next = NULL;
  // 释放剩余空间
  while (pa != NULL) {
    del = pa;
    pa = pa->next;
    free(del);
  }
  while (pb != NULL) {
    del = pb;
    pb = pb->next;
    free(del);
  }
  free(B);
}
复制代码


16


image.png


  • 判断连续子序列的链表版,其实跟字符串是一样的
  • 两个链表都从第一个结点开始比较,如果不同
  • 则A链表从下一个结点开始,B链表从头开始
  • B链表能匹配到表尾表示匹配成功
  • 时间复杂度O(n2),空间复杂度O(1)


bool isSubseq(LinkList A, LinkList B) {
  // 1.创建工作指针,p记录每趟比较中的开始结点
  LNode *pa = A->next, *pb = B->next, *p = A->next;
  // 2.遍历
  while (pa != NULL && pb != NULL) {
    if (pa->data == pb->data) {
      pa = pa->next;
      pb = pb->next;
    } else {
      p = p->next;
      pa = p;             // 重新开始一趟比较
      pb = B->next;
    }
  }
  if (pb == NULL) return true;    // 3.如果pb都能匹配上,证明是A的子序列
  return false;
}


目录
相关文章
|
2月前
|
算法 安全 大数据
揭秘!Python堆与优先队列:数据结构的秘密武器,让你的代码秒变高效战士!
【7月更文挑战第8天】Python的heapq模块和queue.PriorityQueue提供堆与优先队列功能,助你提升算法效率。堆用于快速找大数据集的第K大元素,如示例所示,时间复杂度O(n log k)。PriorityQueue在多线程中智能调度任务,如模拟下载管理器,按优先级处理任务。掌握这些工具,让代码运行更高效!
58 1
|
19天前
|
存储 算法 C语言
数据结构基础详解(C语言):单链表_定义_初始化_插入_删除_查找_建立操作_纯c语言代码注释讲解
本文详细介绍了单链表的理论知识,涵盖单链表的定义、优点与缺点,并通过示例代码讲解了单链表的初始化、插入、删除、查找等核心操作。文中还具体分析了按位序插入、指定节点前后插入、按位序删除及按值查找等算法实现,并提供了尾插法和头插法建立单链表的方法,帮助读者深入理解单链表的基本原理与应用技巧。
|
19天前
|
存储 C语言 C++
数据结构基础详解(C语言) 顺序表:顺序表静态分配和动态分配增删改查基本操作的基本介绍及c语言代码实现
本文介绍了顺序表的定义及其在C/C++中的实现方法。顺序表通过连续存储空间实现线性表,使逻辑上相邻的元素在物理位置上也相邻。文章详细描述了静态分配与动态分配两种方式下的顺序表定义、初始化、插入、删除、查找等基本操作,并提供了具体代码示例。静态分配方式下顺序表的长度固定,而动态分配则可根据需求调整大小。此外,还总结了顺序表的优点,如随机访问效率高、存储密度大,以及缺点,如扩展不便和插入删除操作成本高等特点。
|
19天前
|
存储 C语言
数据结构基础详解(C语言): 栈与队列的详解附完整代码
栈是一种仅允许在一端进行插入和删除操作的线性表,常用于解决括号匹配、函数调用等问题。栈分为顺序栈和链栈,顺序栈使用数组存储,链栈基于单链表实现。栈的主要操作包括初始化、销毁、入栈、出栈等。栈的应用广泛,如表达式求值、递归等场景。栈的顺序存储结构由数组和栈顶指针构成,链栈则基于单链表的头插法实现。
123 3
|
19天前
|
存储 算法 C语言
C语言手撕数据结构代码_顺序表_静态存储_动态存储
本文介绍了基于静态和动态存储的顺序表操作实现,涵盖创建、删除、插入、合并、求交集与差集、逆置及循环移动等常见操作。通过详细的C语言代码示例,展示了如何高效地处理顺序表数据结构的各种问题。
|
2月前
|
算法 计算机视觉 开发者
燃爆全场!Python并查集:数据结构界的网红,让你的代码炫酷无比!
【7月更文挑战第16天】并查集,Python中的效率明星,处理不相交集合合并与查询。用于社交网络分析、图像处理、图论算法等领域。优雅实现结合路径压缩和按秩合并
30 1
|
3月前
|
存储 算法
【单向链表】数据结构——单向链表的介绍与代码实现&笔记
【单向链表】数据结构——单向链表的介绍与代码实现&笔记
|
3月前
|
搜索推荐 算法
【排序】数据结构——排序算法概念及代码详解(插入、冒泡、快速、希尔)
【排序】数据结构——排序算法概念及代码详解(插入、冒泡、快速、希尔)
|
2月前
|
存储 算法 安全
解锁Python高级数据结构新姿势:堆与优先队列的实战演练,让你的代码更优雅!
【7月更文挑战第8天】Python的`heapq`模块和`queue.PriorityQueue`提供堆与优先队列功能,用于高效数据管理。堆是完全二叉树,`heapq`实现最小堆,常用于任务调度,如按优先级执行任务。当需要线程安全且更复杂操作时,`queue.PriorityQueue`成为优选,例如在管理网络请求时按优先级处理。这两个数据结构能提升代码效率和可读性。
31 0
|
3月前
|
算法
数据结构和算法常见的问题和代码
数据结构和算法常见的问题和代码
26 0