关于牛客网剑指offer编程题思路(链表篇)
2018-03-22 13:27
148 查看
前言
最近在刷牛客网的剑指offer编程题,先从链表刷起。分别介绍每道题的思路,仅供题解参考和作个人总结,不包含代码,避免剧透。其中有一道题是包含二叉树的,就划到二叉树去,此处略过不表。相关题目来源
牛客网剑指offer编程题_链表解题思路
解题时需检查该节点是否存在,是否为NULL。1. 链表中倒数第k个结点
需要两个指针,快指针先行k步后,快慢指针再同时前进,最后快指针走到结尾的NULL时慢指针刚好停留在倒数第k个节点上。2. 合并两个排序的链表
这个思路没什么好说的,需要保存一个首节点小的头指针用于最后返回。3. 反转链表
从头开始遍历,改变当前指针的next指向即可。4. 复杂链表的复制
先复制一次正常next顺序的指针,用map保留<旧指针,新指针>的映射,最后再遍历一次,根据旧指针的random和map找到新指针的random。5. 两个链表的第一个公共结点
遍历得到两个链表长度,再根据长度差,长链表的指针先走长度差的距离,最后两个指针一起走。6. 从尾到头打印链表
遍历的时候push进栈。7. 链表中环的入口结点
先判断是否有环,再找到入口。需要两个指针,快指针一次走2步,慢指针一次走1步。最后若能相遇,则说明环是存在的,若最后遇到NULL,说明不存在环。验证:假设入口前的距离为x,入口到相遇点为a,环周长为c。
快指针走的距离 = 慢指针走的距离 × 2
4000
x + c * m + a = (x + c * n + a) × 2
化简得:x = (n - 2m)c - a = (n - 2m - 1)c + c - a
也就是入口前的路程距离等于多圈环周长+相遇点后到入口的距离c-a
最后让两个指针分别在起点和相遇点各自开始出发,每次走一步,最后两个指针一定能在入口处相遇。
8. 删除链表中重复的结点
只要某个节点的值在链表中重复出现,该值的节点就要被移除 ,所以需要一个pre指针指向头结点,才方便对第一个节点进行移除操作。若当前节点值和下个节点值相同,则循环移除当前节点以及后面与该值相同的节点。参考
https://www.nowcoder.com/questionTerminal/253d2c59ec3e4bc68da16833f79a38e4相关文章推荐
- 关于牛客网剑指offer编程题思路(栈和队列篇)
- 关于数组随机不重复的思路
- 关于制作一个通用的DOS批处理段注释命令的思路介绍
- [置顶] 关于有环链表的求入环节点的思路
- 关于处理if和复杂逻辑的一种思路及…
- 自定义View关于measure流程的基本思路整理
- 关于搞国外网赚的一些思路
- 关于项目思路的小计(随笔)
- 关于数据库自动化运维平台的设计及开发实现思路 推荐
- 某公司关于shell的编程题
- 关于mock或者aop classloader思路描述
- 关于选择问题的一些思路.
- 关于iOS购物车的初学写法思路
- 关于秒杀的系统架构优化思路
- 关于网络时间传播的求解思路(工作流程时间计算)
- 关于Activity和Task的设计思路和方法
- 关于php 高并发解决的一点思路
- 关于如何解决特定场景下WPF4.0中“XamlWriter.Save序列化限制”问题的一种思路
- 数据结构:关于重建二叉树的三种思路
- 关于增量更新云平台数据的设计思路