单链公共结点问题
来源:互联网 发布:保险网络大学认证教育 编辑:程序博客网 时间:2024/06/05 13:22
本总结是是个人为防止遗忘而作,不得转载和商用。
题目
给定两个单向链表,计算两个链表的第一个公共结点,若没有公共节点,返回空。
这道题的渊源
这道题的渊源如上图所示,求A和B的最近共同祖先(即上图蓝色箭头所示的那个点),即:“A到根节点的路线”和“B到根节点的路线”相遇的离A和B最近的点。
而“A到根节点的路线”和“B到根节点的路线”是两个单向链表,因此这就是求两个单向链表的第一个公共节点。
分析
既然这两个是单向链表,那一旦两链表相交后就再也无法分开了,如下图所示:
既然如此,那就这样做:
假设两链表的长度为m和n(m>n),由于两个链表从第一个公共结点到链表的尾结点是完全重合的。所以前面的(m-n)个结点一定没有公共结点,如上图所示。
即:
因此先分别遍历两个链表得到它们的长度m,n。
令长链表空转|m-n|次(到达上图所示的竖线位置),然后同步遍历两链表,直到找到相同结点(上图所示的O)或到链表结束。
复杂度
时间复杂度是O(m+n);
扩展
对于链表存在环,如下图(另一个链表就不画了,反正两个链表有个交点):
这时在计算共同节点的话就需要:
两个指针p和q分别指向两个链表的表头,然后同时一个p++,一个(q++)++的同时向后走,最后当p=q时返回就好,这时就是共同节点。
- 单链公共结点问题
- 交叉链表公共结点
- 两个链表公共结点
- 算法学习-单链表公共结点问题
- 两个链表的公共结点
- 两个链表的公共结点
- 两个链表的公共结点
- C++两个链表的公共结点
- 两个单链表的相交问题,第一个公共结点
- 单链表带头结点&不带头结点
- 单链表带头结点&不带头结点
- 单链表带头结点&不带头结点
- 找两条单链表的公共结点
- 单链表头结点的作用
- 找出两个链表的第一个公共结点--总结
- 找出两个链表的第一个公共结点
- 找两个链表的第一个公共结点
- 找出两个链表的第一个公共结点
- Android studio文件结构
- 文章概要
- 关于Android 6.0二维码生成和识别的简单理解和常见问题
- ContentProvider 源码解析
- mysql安装后没有弹出配置向导
- 单链公共结点问题
- Redis学习随笔
- HDU 5925 Coconuts 【离散化+BFS】 (2016CCPC东北地区大学生程序设计竞赛)
- python-web
- Timer的缺陷 用ScheduledExecutorService替代
- Struts2+Spring+Hibernate的工作流程及原理(整理的)
- PS CC 2015 GIF动画制作 和 导出方法,图像序列
- Javacript Ajax 理解运用
- 记录一下python的数据结构 - tuple