剑指 Offer 52. 两个链表的第一个公共节点
题目描述:



我的题解:
方法一:双指针法
思路分析:
- 声明两个指针p1,p2 分别指向链表A、链表B。
- 然后分别同时逐结点遍历
- 当 p1 到达链表 headA 的末尾时,重新定位到链表 headB 的头结点;当 p2 到达链表 headB 的末尾时,重新定位到链表 headA 的头结点。
- 如此,当它们相遇时,所指向的结点就是第一个公共结点。
(p1 p2可以分别遍历完两条链表。同时开始,将可以保证同时遍历结束。又因一旦同时指向第一个相交节点时,剩下的节点数相同;故可以保证p1和p2能同时指向到第一个相交节点(即相遇))
代码如下:
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
if (headA == null || headB == null) return null;
ListNode p1 = headA;
ListNode p2 = headB;
int change =0; // 重定位到链表头的次数和
while (p1 != p2) {
if (p1.next == null) {
p1 = headB; // 重定位到另一链表头
change++;
} else p1 = p1.next;
if (p2.next == null) {
p2 = headA; // 重定位到另一链表头
change++;
} else p2 = p2.next;
if (change > 2) return null; // 两个指针均已遍历另一条链表了
}
return p1;
}
方法二:也是双指针,但先求链表长度,再同时移动
思路分析:
- 声明两个指针p1,p2 分别指向链表A、链表B。
- 稍后做一定的处理后 会同时移动两个指针。
- 此题中,可以保证两指针最后同时到达链表尾,那么,也就可以保证同时到达相交结点(如果有的话)。
- 那么,如何保证呢?分别求出两条链表的长度,然后,让长链表对应的指针,先走几步(步数为多出来的节点数)。
- 做完上一步的处理后,p1和p2再同时移动,便可同时到达链表尾,自然就可以保证同时到达相交节点了(如果有的话)。
代码如下:
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
ListNode p1 = headA;
ListNode p2 = headB;
int len1 = getLength(headA);
int len2 = getLength(headB);
int different = len1 - len2;
// 长的指针,先走different步
if (different > 0) { // headA 长
for (int i = different; i > 0; i--) {
p1 = p1.next;
}
} else { // headB长 或 同样长(different=0,不进for循环了)
for (int i = -different; i > 0; i--) {
p2 = p2.next;
}
}
// 接着, p1,p2同时移动。当 p1 p2指向同一节点时,该节点即为题目所求的相交节点
while (p1!=null && p2!=null && p1 != p2) {
p1 = p1.next;
p2 = p2.next;
}
return p1;
}
private int getLength(ListNode head) {
int cnt = 0;
for (ListNode tmp = head; tmp !=null ; tmp = tmp.next) {
cnt++;
}
return cnt;
}
剑指 Offer 52. 两个链表的第一个公共节点的更多相关文章
- 剑指 Offer 52. 两个链表的第一个公共节点 + 链表 + 第一个公共结点 + 双指针
剑指 Offer 52. 两个链表的第一个公共节点 Offer_52 题目详情 题解分析 可以使用两个指针 node1,node2 分别指向两个链表 headA,headB 的头结点,然后同时分别逐结 ...
- 力扣 - 剑指 Offer 52. 两个链表的第一个公共节点
题目 剑指 Offer 52. 两个链表的第一个公共节点 思路1(栈) 若两个链表相遇,则从它开始相遇的地方到链表末尾应该都是相同的,那么我们可以将两个链表分别放入两个栈中,然后依次循环比较两个栈顶的 ...
- 每日一题 - 剑指 Offer 52. 两个链表的第一个公共节点
题目信息 时间: 2019-07-03 题目链接:Leetcode tag: 单链表 难易程度:简单 题目描述: 输入两个链表,找出它们的第一个公共节点. 示例: A: a1 -> a2 \ - ...
- [LeetCode]剑指 Offer 52. 两个链表的第一个公共节点
题解 nodeA走一个链表A(A独有+公共),再走B独有的长度, nodeB走一个链表B(B独有+公共),再走A独有的长度. 结果:两者相遇点即为交点:若没有交点,两者都走到null,会返回null. ...
- 【Java】 剑指offer(52) 两个链表的第一个公共结点
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 输入两个链表,找出它们的第一个公共结点. 思路 蛮力法:遍历第一个 ...
- 剑指offer——55两个链表的第一个公共节点
题目描述 输入两个链表,找出它们的第一个公共结点. 题解: 分别遍历两个链表到链尾,并计算其长度,若最后一个节点相同,则存在公共节点 然后让长链表指针从头先移动长度差个节点,然后两个链表指针一起移动, ...
- 【剑指offer】两个链表的第一个公共结点,C++实现
原创文章,转载请注明出处! 博客文章索引地址 # 题目 #举例 如果两个单向链表有公共的节点,那么这两个链表从第一个公共结点开始,之后所有结点都是重合的,不可能再出现分叉.拓扑结构如下图所示: # 思 ...
- Go语言实现:【剑指offer】两个链表的第一个公共结点
该题目来源于牛客网<剑指offer>专题. 输入两个链表,找出它们的第一个公共结点. Go语言实现: //长度长的先走个长度差,然后ab一起比较后面结点 //长度一样,公共结点可能在首结点 ...
- 【剑指offer】两个链表的第一个公共结点
一.题目: 输入两个链表,找出它们的第一个公共结点. 二.思路: 思路一:模拟数组,进行两次遍历,时间复杂度O(n2) 思路二:假定 List1长度: a+n List2 长度:b+n, 且 a&l ...
随机推荐
- 网页不让用户复制方法总汇,设置html禁止选择,保护源码,js禁止复制文字
这篇文章主要讲解:右键复制失效方法.菜单"文件"-"另存为"失效方法.防止查看源代码进行复制的方法.防止页面缓存的方法.来达到一定的代码保护效果 右键复制失效方 ...
- MVC + EFCore 项目实战 - 数仓管理系统2- 搭建基本框架配置EFCore
本次课程就正式进入开发部分. 首先我们先搭建项目框架,还是和之前渐进式风格保持一致,除必备组件外,尽量使用原生功能以方便大家理解. 开发工具:vs 2019 或以上 数据库:SQL SERVER 20 ...
- [JAVA]《JAVA开发手册》规约详解
[强制] 使用 Map 的方法 keySet()/values()/entrySet()返回集合对象时,不可以对其进行添加元素操作,否则会抛出 UnsupportedOperationExceptio ...
- 我们现在的git版本管理
1.git发布正式版都统一用master分支的代码发布2.每次开发下一版本的需求时,将master分支的代码打一个tag,版本号与后台一致3.需要紧急修复线上的bug时,从master分支拉一个分支出 ...
- matlab 打包exe
mcc -m gui_abc.m https://blog.csdn.net/hujiameihuxu/article/details/53525373 deploytool app compiler
- Mysql基础(一):Mysql初识、基本指令、数据库密码相关、创建用户及授权
来源:https://www.cnblogs.com/liubing8/p/11432534.html 目录 数据库01 /Mysql初识.基本指令.数据库密码相关.创建用户及授权 1. 数据库概述 ...
- mongodb(二):数据库安装,部署(linux)
1.下载安装包 wget http://fastdl.mongodb.org/linux/mongodb-linux-i686-1.8.2.tgz 下载完成后解压缩压缩包 tar zxf mongod ...
- JavaScript:父页面与Iframe页面方法互调
父页面调用Iframe页面中的函数 以上是父页面中定义的iframe,注意添加name属性 在父页面中调用mapFrame的ShowMyLocation方法 Iframe页面调用父页面的方法 直接在I ...
- 【IDEA】创建maven项目,webapp没有被标识,无法识别
问题描述 新建maven项目模块后,webapp目录未被标识,也就是没有小蓝点的图标显示. 解决方法 点击"File"下的"Project Strucure", ...
- CocosCreator之AssetBundle使用方案分享
前言 Creator2.4 推出了AssetBundle,使得所有平台都有了分包的能力.那么该如何使用这个强大的功能呢?下面介绍一下我个人的用法,仅供参考,水平有限,非喜勿喷. 根据官方文档 指出,之 ...