前言>写此文章的主旨中心是为了给阅读的同学提供一个只有干货+实战的心得体会, 方便没有自己的学习路线的同学能够快速了解一些问题的核心以及解决问题的思路.
当然了这些内容也不是自己思考出来的,也是通过学习别人的内容总结归纳出来的,所以对于博主来说也是一个学习成长以及记录的过程, 有一些不足之处还请谅解, 希望大家都能共同进步, 汲取更多的知识, 早日找到中意的工作~
对于链表这种基本数据类型的结构, 所有能够出现的问题, 无外乎的解决方式通常有一下几种
1) 观察是否可以通过技巧巧妙解决, 比如普遍的双指针-在链表中最常用的快慢指针
2) 如果无法想到技巧, 则比较实在的通过 遍历, 递归 等思路以子问题的方式做问题的拆分
以上描述的解题方式从本质上来说, 形似于之前开始提过的二叉树的解决方式, 即 遍历思路 以及 拆解思路
本篇我们通过一些常见的题型 来演示一下解题思路的巧妙运用:
1.leetcode 876 判断链表的中间节点:
该题的思路我们直接用到了 快慢指针的思想, 即让快指针每次走两步, 慢指针每次走1步, 当快指针到结尾时, 慢指针即为中间节点
代码如下:
2.leetcode 160 相交链表:
该题的思路我们用到了一个相对巧妙的思想, 两条链表长度不一致, 我们将长度叠加, 即节点A追加节点B, 节点B追加节点A
此时两个追加后的节点长度一致, 如果它们相交, 则步长一致递进最终会走到相交点, 如果不相交, 则最终都为null节点
代码如下:
3.leetcode 142 环形链表II:
该题是判断环形链表的升级版, 首先我们还是用之前的思路, 要判断链表是否成环, 也是用到了快慢指针的思想, 相遇则有环
在有环的基础上, 我们假设慢指针走了k步, 快指针走了2k步最终在环内的一点相遇
此时慢指针走的k = 慢指针到 成环点的距离 + 成环点到相交点的距离
快指针从相交点 再次回到相交点 是另外一个k 假设成环点到相交点距离为b, 此时 快指针从相交点 走到成环点的距离 = k - b
而K-b这个距离 恰好等于 慢指针的到相交点的距离k - 成环点到相交点的距离 b
所以代码如下:
4.leetcode 23 合并K个升序链表:
该题的思路也是基于合并两个链表的策略升级, 如果我们采用暴力的方式, 可以一次循环链表, 依次叠加合并
相对有策略的思路, 基于我们之前排序用过的方式-分治法
代码如下:
以上就是一些基本常见的题型的技巧型分析思路即问题解决方案的代码, 如果您还有什么更好的解决方案, 也可留言出来大家一起共同讨论, 共同进步~