首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

大厂面试系列(七):数据结构与算法等

数据结构和算法 链表 链表,常见的面试题有写一个链表中删除一个节点的算法、单链表倒转、两个链表找相交的部分,这个一般必须得完全无误的情况下写出来; 给出两个链表的头结点,找出这两个链表的交点。...有k个有序单链表,怎么合并成一个有序单链表? 链表逆序,不能用修改指针的方法,用递归如何实现。...两个1G排好序的文件,按序合并 手写归并排序。两个有序数组合并。 常见的排序算法有哪些?各种排序算法的平均时间复杂度和最坏情况下的时间复杂度?...红黑树,这个基本上必问的一个数据结构,包括红黑树的概念、平均算法复杂度、最好最坏情况下的算法复杂度、左右旋转、颜色变换。 找出二叉树中任意两个节点的最低公共根节点, 如果树是BST呢....给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷窃到的最高金额。

1.2K20

Swift 实现链表重新排列:L0 → Ln → L1 → Ln-1

重排链表不积跬步,无以至千里;不积小流,无以成江海,Swift社区 伴你前行。如果大家有建议和意见欢迎在文末留言,我们会尽力满足大家的需求。难度水平:中等摘要链表的重新排列是链表操作的进阶问题。...]1 链表可以分为以下 3 个步骤:找到链表的中点:使用快慢指针法找到链表的中间节点。...反转后半部分链表:从中间节点开始,反转链表的后半部分。合并两部分链表:交替合并前半部分和反转后的后半部分。...Step 3: 合并两部分链表使用两个指针 first 和 second 分别遍历前半部分和反转后的后半部分。按照交替顺序重新连接节点。...总结本题通过三步解决链表重新排列问题,重点在于快慢指针、链表反转及合并操作的结合使用。关键点总结:快慢指针找到链表中点是链表问题的通用技巧。反转链表是基础操作,但需要切断前后部分以防止循环。

14400
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    程序员必备的50道数据结构和算法面试题

    编码面试主要包括数据结构和基于算法的问题,以及一些诸如如何在不使用临时变量的情况下交换两个整数这样的逻辑问题? 我认为将编程面试问题划分到不同的主题区域是很有帮助的。...解决数组问题的关键是,你要对数组这种数据结构有一个深刻的认识,同时还要了解基本的程序流程如循环、递归以及基本的操作符。...不过和数组不同的是,链表的元素不是存储在连续位置中,而是分散在各个内存中的各个位置,通过节点链接起来。一个链表就是一个包含了下个节点内存地址的节点列表。...4、不使用递归,怎样反转单个链表? 5、在未排序链表中,怎样移除重复的节点? 6、怎样找出单个链表的长度? 7、从单个链表的结尾处,怎样找出链表的第三个节点? 8、怎样使用栈计算两个链表的和?...4、如何在给定二叉树上实现中序遍历? 5、不使用递归情况下如何使用中序遍历输出给定二叉树所有节点? 6、如何实现后序遍历算法? 7、如何不使用递归实现二叉树的后续遍历?

    3.2K11

    程序员必备的50道数据结构和算法面试题

    编码面试主要包括数据结构和基于算法的问题,以及一些诸如如何在不使用临时变量的情况下交换两个整数这样的逻辑问题? 我认为将编程面试问题划分到不同的主题区域是很有帮助的。...解决数组问题的关键是,你要对数组这种数据结构有一个深刻的认识,同时还要了解基本的程序流程如循环、递归以及基本的操作符。...不过和数组不同的是,链表的元素不是存储在连续位置中,而是分散在各个内存中的各个位置,通过节点链接起来。一个链表就是一个包含了下个节点内存地址的节点列表。...4、不使用递归,怎样反转单个链表? 5、在未排序链表中,怎样移除重复的节点? 6、怎样找出单个链表的长度? 7、从单个链表的结尾处,怎样找出链表的第三个节点? 8、怎样使用栈计算两个链表的和?...4、如何在给定二叉树上实现中序遍历? 5、不使用递归情况下如何使用中序遍历输出给定二叉树所有节点? 6、如何实现后序遍历算法? 7、如何不使用递归实现二叉树的后续遍历?

    4.3K20

    排序链表 算法解析

    首先来了解一下什么是归并排序,归并排序是自顶向下直接合并的方式进行排序,具体过程如下: 1、找到链表中点,以中点为界,将链表拆成两个子链表。 2、对两个子链表分别排序。...3、将两个排序后子链表合并,得到完成链表。 因为上述的过程是通过递归实现的,所以时间复杂度为O(n log n),空间复杂度为O(log n)。...空间复杂度:O(log n) 其中n是链表的长度,空间复杂度主要取决于递归调用的栈空间。 三、总结 通过递归实现链表的归并排序,主要分成两步。 第一步是分割成两个子链表。...可以使用快慢指针,快指针每次移动2步,慢指针每次移动1步,当快指针移动到链表末尾时,慢指针指向链表的节点就是链表的中点。 第二步是子链表递归分别排序。...设置两个指针分别指向两个链表头部,比较两个指针处节点值大小,由小到大加入合并到链表头部,指针交替前进,直到添加完两个链表。

    23910

    题型篇 | 数据结构与算法之链表系列

    3、递归实现 可以通过递归的方式来实现单链表从尾到头依次输出,递归过程涉及到“递”和“归”,反转链表输出数据,正式利用了循环“递”的过程,所以数据先从头部输出,那么递归采用的是“归”的过程来输出内容,输出当前结点先要输出当前节点的下一节点...每道题我都做了详细的解析,如:问题分析、算法思路、代码实现、考查内容等,有关链表的相关题目会不断更新...... 1、环形链表 I(☛题目解析) 2、环形链表 II(☛题目解析) 3、合并K个排序链表(...1、结构上 存储链表的内存空间是不连续的,所有需要使用指针将这些零碎内存空间连接起来,导致需要通过指针来进行操作,这也是为什么链表中大多数都是关于指针的操作的原因。...如:从尾到头打印链表、合并两个有序链表、反转链表等。 双指针:链表中大部分都是进行指针操作,链表属于线性表结构(形如一条线的结构),很多问题可以使用双指针来解决,也是非常常用到的。...如:查找倒数第K 结点、求链表的中间结点等。 3、性能上 链表正是因为存储空间不连续,对 CPU 缓存不友好,随时访问只能从头遍历链表,时间复杂度为 O(n),但是链表的这种结构也有个好处就是。

    61210

    剑指offer | 面试题19:合并两个有序链表

    合并两个有序链表 题目描述:输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。...解题思路: 根据题目描述,链表l1,l2是递增的,因此容易想到使用双指针l1和l2遍历两链表,根据l1.val和 l2.val的大小关系确定节点添加顺序,两节点指针交替前进,直至遍历完毕。...引入伪头节点 :由于初始状态合并链表中无节点,因此循环第一轮时无法将 节点添加到合并链表中。解决方案:初始化一个辅助节点dum作为合并链表的伪头节点,将各节点添加至dum之后。...返回值:合并链表在伪头节点dum之后,因此返回dum.next即呵。 复杂度分析: 时间复杂度O(M + N) : M,N分别为链表l1, l2的长度,合并操作需遍历两链表。...空间复杂度 O(1) :节点引用 dum, cur使用常数大小的额外空间。

    32130

    【递归回溯与搜索算法篇】算法的镜花水月:在无尽的自我倒影中,递归步步生花

    合并两个有序链表 题目描述: 将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。...链表指针的递归合并涉及指针的不断改变,清晰的画图可以有效避免混乱。 递归函数的设计: 递归函数的核心是不断比较两个链表的头节点,选择较小的节点作为合并后的链表的当前节点,并递归处理剩余部分。...即问题具有相同的结构,可以递归处理。 递推关系:当我们知道规模更小的子问题(如 n - 1)的解时,能够通过递推关系直接计算出规模为 n 的问题的解。这种递推关系能够使得问题逐层缩小。...合并两个有序链表:通过递归合并剩余部分的链表并解决当前头节点。简单情况为某一链表为空时直接返回另一链表。 反转链表:递归将链表中剩余部分反转,并将当前节点放到反转结果之后。...快速幂问题:使用递归对幂次进行二分计算,以减少计算次数,递归到 n=0 时返回 1。通过 n 的奇偶判断是否需要乘上额外的 x,从而完成快速幂。

    9510

    14种模式搞定面试算法编程题(PART I)

    在某些情况下,窗口的大小保持不变,而在其他情况下,大小会增大或缩小。 ? 应用场景 okay,理解了滑动窗口原理之后,那么什么情况下我们会需要用到它呢?...这种解决方案虽然确实可行,但是对时间和空间复杂度来说明显是低效的 。在许多情况下,使用双指针可以帮助你找到具有更好空间或时间复杂度的解决方案。 ?...通过以不同的速度移动(例如,在循环链表中),算法证明两个指针必然会相遇。一旦两个指针都处于循环循环中,快速指针就应该捕获慢速指针。 ?...Tree DFS的基本思想是使用递归(或迭代方法的堆栈)在遍历时跟踪所有先前(父)节点。...为当前节点的两个子节点进行两次递归调用来处理它们。 ?

    2.1K11

    空间复杂度与链表刷题

    那么, 判断链表相交 ,我们可以遍历链表, 如果两个链表最后一个节点相等的话, 那么就一定相交, 但是如何返回第一个相交节点呢, 通过分别比较吗, 大可不必, 在我们遍历链表的时候, 我们可以顺便计算出链表的相对差值..., 那我们如何找到入环时的第一个节点呢?...合并两个有序链表: 将两个有序链表合并为一个有序链表。 删除链表中的重复元素: 删除链表中重复的元素,使得每个元素只出现一次。...在解决链表面试题时,常用的方法有: 递归法: 使用递归的方式处理链表的问题,递归可以简化问题的处理过程。...快慢指针法: 使用快慢指针来寻找链表中的某个位置,如链表中的中间节点、倒数第k个节点等。 翻转链表法: 使用指针来改变链表节点的指向,实现链表的翻转。

    8510

    力扣的链表题,发现了超级多的知识点

    插入 插入只需要考虑要插入位置前驱节点和后继节点(双向链表的情况下需要更新后继节点)即可,其他节点不受影响,因此在给定指针的情况下插入的操作时间复杂度为O(1)。...上面提到了链表结构天生具有递归性,那么使用递归的解法或者递归的思维都会对我们解题有帮助。 在 二叉树遍历 部分,我讲了二叉树的三种流行的遍历方法,分别是前序遍历,中序遍历和后序遍历。...它的作用无非就两个: 将头节点变成中间节点,简化判断。 通过在合适的时候断开链接,返回链表的中间节点。 我上面提到了链表的三个注意,有一个是边界。...如果题目需要返回链表中间的某个节点呢?实际上也可借助虚拟节点。...因此如果题目中需要你使用归并排序去合并链表,那其实归并排序这部分已经不再本文的讨论范围了。

    90631

    链表排序总结(全)(C++)

    排序链表 里面,就会因为超出时间限制而没法通过最后一个测试用例。 可以看到,如果可以交换节点的值,那使用插入、快排这些顺序遍历可以实现的算法都是可以的(当然,快排就不能使用双指针法了)。...上一节为什么说插入比冒泡更简单呢(无论是链表还是数组,一般都优先使用插入排序),看下面的图,如果当前要将节点cur插入到节点pre之后: 可以看到整体操作逻辑简单了许多:我们只需要知道cur的前驱和插入位置...先来看归并: 归并排序其实是链表排序的主流方法。 归并主要分为分割和合并两大部分,入栈的时候分割,出栈的时候合并,这也是归并常常采用递归实现的原因。 首先,如何分割?...那不符合要求并不代表归并排序不行,因为递归只是算法的特定实现方式而已,我们也可以使用迭代来实现链表的归并排序。...本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

    89610

    学了链表牛刀小试,三种做法都吃透就算是学会了

    因为我们根本没有利用好给定我们的链表,额外地消耗了内存空间。所以如果在面试当中遇到,面试官是不会只满足于听到这样的回答的。那么,我们又该如何在不创建新链表的前提下完成翻转呢?...递归法 为什么说递归的方法稍微更直观呢?因为我们可以把递归函数本身当成是一个能够在更小范围内运作的黑盒,接着,我们要做的就是像是套娃一样,让它能够在更大的范围当中实现同样的功能。...由于在本题中链表都是通过头节点表示的,所以我们要先遍历一次到达链表的结尾。不要忘了处理一下边界情况,即head为空或者是head->next为空的情况。...,通过遍历的方式去找了最末的节点。...,我们再来思考:如果不使用递归,那么这道题又该怎么解决呢?

    25420

    LeetCode链表知识点&题型总结

    搜索链表需要O(N)的时间复杂度,这点和数组类似,但是链表不能像数组一样,通过索引的方式以O(1)的时间读取第n个数。链表的优势在于能够以较高的效率在任意位置插入或者删除一个节点。...循环链表 ​ 循环链表是一种特殊的单链表,与单链表不同的是尾节点不指向空地址,指向链表的头结点。优点是从链尾到链头比较方便,当要处理的数据具有环形结构特点是,非常适合用循环链表来处理。...注意:在测试时,需要分别选取链表长度为奇数和偶数的test case,可以验证算法在一般情况下的正确性避免遗漏。 3.交换节点的处理。...k个有序链表 解题思路: 分治算法将链表两两合并,最后合并成一个链表,平均一条链表n个节点,合并两条链表为O(n),k条链表合并为O(logk),合并为O(nlogk) class Solution {...这种用法适用于链表的排序处理,如合并 k 个排序链表,排序两个无序链表等。 第四,在解答的过程中,要多考虑边界情况。

    1.6K10

    前端算法系统练习: 链表篇完结

    具体来说: 当 head 节点为空时,我们已经处理,通过✅ 当链表只包含一个节点时, 此时我们希望直接返回这个节点,对上述代码而言,进入循环后 pre 被赋值为cur,也就是head,没毛病,通过✅ 运行在...我们依然有两种类型的解法:循环解法和递归解法。 需要注意的问题就是前后节点的保存(或者记录),什么意思呢?看这张图你就明白了。...唯一的不同在于两个一组的情况下每一组只需要反转两个节点,而在 K 个一组的情况下对应的操作是将 K 个元素的链表进行反转。 递归解法 这一题我觉得递归的解法更容易理解,因此,先贴上递归方法的代码。...如果链表无环,则返回 null。 **说明:**不允许修改给定的链表。 思路分析 刚刚已经判断了如何判断出现环,那如何找到环的节点呢?我们来分析一波。...新链表是通过拼接给定的两个链表的所有节点组成的。

    35510

    算法妙妙屋-------1.递归的深邃回响:C++ 算法世界的优雅之旅

    递归的优势在于其代码通常更简洁且易于理解,尤其是在处理分治问题(如排序、搜索等)时。然而,递归也可能导致栈溢出问题,因为每次调用都会在栈上占用空间,因此在使用时需要考虑调用深度和性能优化。...新链表是通过拼接给定的两个链表的所有节点组成的。...算法思路: 递归函数的含义:交给你两个链表的头结点,你帮我把它们合并起来,并且返回合并后的头结点; 函数体:选择两个头结点中较⼩的结点作为最终合并后的头结点,然后将剩下的链表交给递归函数 去处理; 递归出...反转链表(easy) 题目链接:反转链表 题⽬描述: 解题思路: 先通过一层循环找到尾,因为 尾就是新的头节点 找到尾之后,把 head 做为参数,传给递归函数 递归函数: 如果head->next为空...结果合并:清晰地规划如何合并子问题的结果,以构建最终解。 避免重复计算:对于具有重叠子问题的情况(如斐波那契数列),考虑使用记忆化或动态规划来优化性能。

    8510

    链表排序最优算法_链表算法题

    2 链表归并排序 题目描述:Leetcode 0148 排序链表 分析 因为要求时间O(1),因此就不能使用递归的写法,这一题可以使用归并排序的迭代写法(自底向上)。...这一题十分类似于Leetcode 0023 合并K个有序链表,我们可以使用LC23的思路求解。代码中的变量如下图所示: 上面的做法用C++演示。...合并两个有序链表可以使用Leetcode 0021 合并两个有序链表的方法。...递归的过程中,我们每次都要遍历整个链表,对节点值小于val的节点接到left中,节点值等于val的节点接到mid中,节点值大于val的节点接到right中,之后还要将三个链表的尾结点置为空。...本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

    1K30

    面试官系列 - LeetCode链表知识点&题型总结

    搜索链表需要O(N)的时间复杂度,这点和数组类似,但是链表不能像数组一样,通过索引的方式以O(1)的时间读取第n个数。链表的优势在于能够以较高的效率在任意位置插入或者删除一个节点。...循环链表 ​ 循环链表是一种特殊的单链表,与单链表不同的是尾节点不指向空地址,指向链表的头结点。优点是从链尾到链头比较方便,当要处理的数据具有环形结构特点是,非常适合用循环链表来处理。...,206一定要熟练掌握 迭代法:时间复杂度是O(N), 并且我们是在原链表上进行指针移动的,所以空间复杂度为O(1) 递归法:每个节点最多需遍历两次,一次是常规的递归,一次是回溯的递归,所以时间复杂度是...O(N),在最坏的情况下,我们需要翻转整个链表,并且递归的方法会占用栈,所以空间复杂度是O(N) 这是两个非常典型而且常见的链表翻转类题目,在面试中也经常出现作为热身题,所以需要重点关注。...这种用法适用于链表的排序处理,如合并 k 个排序链表,排序两个无序链表等。 第四,在解答的过程中,要多考虑边界情况。

    68810

    Python 实现反转、合并链表有啥用?

    使用 Python 实现反转链表、合并链表在开发中比较常见,我们先来看看各自的应用场景。先赞再看后评论,腰缠万贯财进门。...合并链表比如,在大规模数据排序中,当数据量太大无法一次性加载到内存中时,可以采用多路归并排序算法。该算法将数据分成多个小块,分别排序后得到多个有序链表,然后通过合并这些有序链表得到最终的有序结果。...反转链表先看在 Python 中实现反转链表,我们可以使用迭代和递归两种方法。下面分别给出这两种方法的详细实现。...使用 Python 实现链表的合并在 Python 中实现链表的合并,常见的情况有合并两个有序链表和合并多个有序链表,下面分别介绍这两种情况的实现方法。...在合并两个链表的过程中,需要考虑链表为空的情况,下面从必要性和不同实现情况来详细分析:必要性考虑链表为空的情况是非常必要的,原因如下:避免程序出错:如果不处理链表为空的情况,在代码中直接访问空链表的节点属性

    3700

    【算法专题】递归算法

    递归 递归 1. 汉诺塔问题 2. 合并两个有序链表 3. 反转链表 4. 两两交换链表中的节点 5....Pow(x, n) --- 快速幂 递归 在解决⼀个规模为 n 的问题时,如果满足以下条件,我们可以使用递归来解决: 问题可以被划分为规模更小的子问题,并且这些子问题具有与原问题相同的解决⽅法。...新链表是通过拼接给定的两个链表的所有节点组成的。...[0, 50] 100 <= Node.val <= 100 l1 和 l2 均按 非递减顺序 排列 思路: 递归函数的含义:交给你两个链表的头结点,把它们合并起来,并且返回合并后的头结点; 函数体:选择两个头结点中较小的结点作为最终合并后的头结点...你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。

    10610
    领券