题目链接

题目描述:




我的题解:

方法一:双指针法

思路分析:

  • 声明两个指针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. 两个链表的第一个公共节点的更多相关文章

  1. 剑指 Offer 52. 两个链表的第一个公共节点 + 链表 + 第一个公共结点 + 双指针

    剑指 Offer 52. 两个链表的第一个公共节点 Offer_52 题目详情 题解分析 可以使用两个指针 node1,node2 分别指向两个链表 headA,headB 的头结点,然后同时分别逐结 ...

  2. 力扣 - 剑指 Offer 52. 两个链表的第一个公共节点

    题目 剑指 Offer 52. 两个链表的第一个公共节点 思路1(栈) 若两个链表相遇,则从它开始相遇的地方到链表末尾应该都是相同的,那么我们可以将两个链表分别放入两个栈中,然后依次循环比较两个栈顶的 ...

  3. 每日一题 - 剑指 Offer 52. 两个链表的第一个公共节点

    题目信息 时间: 2019-07-03 题目链接:Leetcode tag: 单链表 难易程度:简单 题目描述: 输入两个链表,找出它们的第一个公共节点. 示例: A: a1 -> a2 \ - ...

  4. [LeetCode]剑指 Offer 52. 两个链表的第一个公共节点

    题解 nodeA走一个链表A(A独有+公共),再走B独有的长度, nodeB走一个链表B(B独有+公共),再走A独有的长度. 结果:两者相遇点即为交点:若没有交点,两者都走到null,会返回null. ...

  5. 【Java】 剑指offer(52) 两个链表的第一个公共结点

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 输入两个链表,找出它们的第一个公共结点. 思路 蛮力法:遍历第一个 ...

  6. 剑指offer——55两个链表的第一个公共节点

    题目描述 输入两个链表,找出它们的第一个公共结点. 题解: 分别遍历两个链表到链尾,并计算其长度,若最后一个节点相同,则存在公共节点 然后让长链表指针从头先移动长度差个节点,然后两个链表指针一起移动, ...

  7. 【剑指offer】两个链表的第一个公共结点,C++实现

    原创文章,转载请注明出处! 博客文章索引地址 # 题目 #举例 如果两个单向链表有公共的节点,那么这两个链表从第一个公共结点开始,之后所有结点都是重合的,不可能再出现分叉.拓扑结构如下图所示: # 思 ...

  8. Go语言实现:【剑指offer】两个链表的第一个公共结点

    该题目来源于牛客网<剑指offer>专题. 输入两个链表,找出它们的第一个公共结点. Go语言实现: //长度长的先走个长度差,然后ab一起比较后面结点 //长度一样,公共结点可能在首结点 ...

  9. 【剑指offer】两个链表的第一个公共结点

    一.题目: 输入两个链表,找出它们的第一个公共结点. 二.思路: 思路一:模拟数组,进行两次遍历,时间复杂度O(n2) 思路二:假定 List1长度: a+n  List2 长度:b+n, 且 a&l ...

随机推荐

  1. Python入门002

    1.编程语言介绍 分类:机器语言汇编语言高级语言(编译型.解释型号) 总结:#1.执行效率:机器语言>汇编语言>高级语言(编译型>解释型) #2.开发效率:机器语言<汇编语言& ...

  2. java学习第二天 20207/7

    一. 1.对传参进行了了解 2. 2.java的变量命名与c/c++有些不同在java中有¥,字母,下划线和数字,同样不可以是数字开头. java的布尔型为boolean 各个数据类型的信息: 注意: ...

  3. Esp8266 网络结构体

    Esp8266建立网络连接相关结构体如下: 结构体头文件espconn.h /** Protocol family and type of the espconn */ enum espconn_ty ...

  4. day72 bbs项目☞登录注册

    目录 一.表创建及同步 二.注册功能 二.登录页面搭建 一.表创建及同步 from django.db import models from django.contrib.auth.models im ...

  5. 记一次开发CefSharp做浏览器时Shopify绑定不上Paypal问题

    问题:CefSharp做浏览器时Shopify绑定不上Paypal. shopify绑定Paypal的流程大概是如下图所示 步骤1 步骤2 步骤3 步骤4 出现问题大概是在绑定最后一步,并没有如愿的返 ...

  6. 数据可视化之powerBI基础(十六)PowerQuery的这个小功能,让你轻松发现数据质量问题

    https://zhuanlan.zhihu.com/p/64418072 源数据常常包含各种差错值,为了进行下一步的分析,我们必须先找出并更正这些差错,做这些工作几乎不会有什么快乐感可言,但却往往需 ...

  7. 神经网络结构:DenseNet

    论文地址:密集连接的卷积神经网络 博客地址(转载请引用):https://www.cnblogs.com/LXP-Never/p/13289045.html 前言 在计算机视觉还是音频领域,卷积神经网 ...

  8. 008.Nginx静态资源

    一 Nginx静态资源概述 1.1 静态资源类型 Nginx作为静态资源Web服务器部署配置, 传输非常高效, 常常用于静态资源处理,请求以及动静分离.通常非服务器动态运行生成的文件属于静态资源. 类 ...

  9. two types of friend

    两类朋友 第一类,普通朋友,并不能分享一些隐私的感情,只能说一些事情,有一些只是认识的人或者虽然认识很多年但是也只能是这样的! 第二类,关心你,可以交流感清,明显更加亲密一点. 不要对第一类朋友说第二 ...

  10. vue邪道玩法 : 把vue实例存在别的地方,以及可能会遇到的问题

    一般来说,VUE项目中,this指向VUE实例. 但有的时候,某些代码会改变this的指向. 这时,可以用一个临时变量存储VUE实例. test1(){ var _this = this // 把vu ...