题目来源:https://leetcode-cn.com/problems/intersection-of-two-linked-lists/description/

题目描述:

解法一:

先统计两根链表的长度,分别为lenA,lenB。然后两根链表都从头开始遍历,并且让长的链表先跑k步(k为两根链表长度之差)。

然后再同时向后跑,直到跑到相同结点为止。

代码如下:

public class Solution {public ListNode getIntersectionNode(ListNode headA, ListNode headB) {if (headA == null || headB == null)return null;ListNode ha = headA, hb = headB;int lenA = 1, lenB = 1;while (ha.next != null) {ha = ha.next;lenA++;}while (hb.next != null) {hb = hb.next;lenB++;}ha = headA;hb = headB;return getNode((lenA < lenB) ? hb : ha, (lenA < lenB) ? ha : hb, (lenA < lenB) ? lenB - lenA : lenA - lenB);}public ListNode getNode(ListNode l, ListNode s, int len) {for (int i = 0; i < len; i++) {l = l.next;}while (l != null) {if (l == s)break;l = l.next;s = s.next;}return l;}
}

解法二(双指针法):

双指针解法顾名思义需要两个指针,假设指针 pApB 分别指向链表 A 和链表 B 的头结点,之后两个指针分别以步幅为 1 的速度向链表的尾部遍历,当指针 pA 遍历到链表 A 的尾节点时,将指针 pA 指向链表 B 的头部。同样地,当指针 pB 遍历到链表 B 的尾节点时,将指针 pB 指向链表 A 的头部。当两个指针相遇时,指针 pA 或者 pB 所指向的节点就是两个链表的相交节点。

为了说明双指针的求解思路,假设链表 A 和链表 B 的结构如下图所示,

其中,链表 A 包含 6 个节点,节点的值分别为 1、3、5、7、9 和 11;链表 B 包含 4 个节点,节点的值分别为 2、4、9 和 11,因此,两个链表的相交节点为 9。设链表 A 中不相交的部分(即蓝色部分的节点)长度为 L1 L1 ,链表 B 中不相交的部分(即黄色部分的节点)长度为 L2 L2 ,两个链表相交的部分(即红色部分的节点)长度为 L3 L3 。

如下图所示,当指针 pB 遍历到链表 B 的尾节点 11 时,指针 pA 遍历到链表 A 中节点 7 的位置,下一次遍历指针 pB 将处于链表 A 的节点 1 的位置。

同理,当指针 pA 遍历到链表 A 的尾节点 11 时,此时指针 pB 处于链表 A 中节点 3 的位置,下一次遍历指针 pA 将处于链表 B 的节点 2 位置。

再经过两次遍历后,指针 pA 将位于链表 B 中节点 4 的位置,而指针 pB 也将到达链表 A 的节点 4 的位置,下一次遍历两个指针将在节点 9(即相交节点)相遇。此时,两个指针走过的长度都为 L1+L2+L3 L1+L2+L3 。究其原因,可以将两个指针走过的“路程”看成 3 个部分,即蓝色部分、红色部分以及橙色部分,只是两个指针走过 3 个部分的顺序是不同的,指针 pA 先走蓝色部分而指针 pB 先走橙色部分,但是经过前 3 个部分后,两个指针走过的长度一定是相同的,因此在下一次遍历的时候两个指针一定会相遇。

代码如下:

public class Solution {public ListNode getIntersectionNode(ListNode headA, ListNode headB) {if (headA == null || headB == null) {return null;}ListNode pA = headA;ListNode pB = headB;while (pA != pB) {pA = pA == null ? headB : pA.next;pB = pB == null ? headA : pB.next;}return pA;}
}

LeetCode160.相交链表相关推荐

  1. Leetcode160. 相交链表

    Leetcode160. 相交链表 题目: 编写一个程序,找到两个单链表相交的起始节点. 示例 1: 输入:intersectVal = 8, listA = [4,1,8,4,5], listB = ...

  2. 47 - 算法 - Leetcode-160 -相交链表

    // 链表对齐 - 160 相交链表class Solution {public:ListNode *getIntersectionNode(ListNode *headA, ListNode *he ...

  3. [Swift]LeetCode160. 相交链表 | Intersection of Two Linked Lists

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ ➤微信公众号:山青咏芝(shanqingyongzhi) ➤博客园地址:山青咏芝(https://www.cnblog ...

  4. leetcode160 相交链表

    编写一个程序,找到两个单链表相交的起始节点. 如下面的两个链表: 在节点 c1 开始相交. 示例 1: 输入:intersectVal = 8, listA = [4,1,8,4,5], listB ...

  5. 【每日一算法】相交链表

    微信改版,加星标不迷路! 每日一算法 - 相交链表 编写一个程序,找到两个单链表相交的起始节点. 如下面的两个链表: 在节点 c1 开始相交. 示例 1: 输入:intersectVal = 8, l ...

  6. 《LeetCode力扣练习》第160题 相交链表 Java

    <LeetCode力扣练习>第160题 相交链表 Java 一.资源 题目: 给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点.如果两个链表不存 ...

  7. leetcode 160 简单难度 相交链表

    160. 相交链表 编写一个程序,找到两个单链表相交的起始节点. 如下面的两个链表: 在节点 c1 开始相交. 输入:intersectVal = 8, listA = [4,1,8,4,5], li ...

  8. 文巾解题 160. 相交链表

    1 题目描述 2 解题思路 2.1 哈希表 遍历listA,把每个节点(以及后继节点)放入一个list中.遍历完A之后遍历B,如果B的某个节点(以及后继节点)在这个list中,那么我们就找到了相交的部 ...

  9. LeetCode-链表-160. 相交链表

    160. 相交链表 思路一:使用set用到了额外的内存,没有达到题目要求 /*** Definition for singly-linked list.* struct ListNode {* int ...

最新文章

  1. 信号系统的一些基本概念
  2. python第七周答案_马哥2016全新Linux+Python高端运维班第七周作业
  3. 洛谷 1351 联合权值——树形dp
  4. UNIX 环境高级编程 文件和目录
  5. Java-Map从入门到性能分析1【Map初识、Map通用方法、HashMap的使用(遍历方法、性能分析)】
  6. 源代码安装g95编译器
  7. Linux系统编程19:基础IO之了解Linux中的标准输入和输出以及相关的系统调用接口(如write,read等)
  8. 2020 前端学习路线总结,哎呦,不错哦!
  9. python遍历字典与for循环运用方法
  10. Script to Setup NTP/DNS/Powerpolicy for new server
  11. yv12转nv12,nv12转I420
  12. php5.6 连接SQL SERVER
  13. 关于Android项目隐藏标题栏的方法总结
  14. MySQL 根据身份证号查询个人信息
  15. 多图预警~ 华为 ECS 与 阿里云 ECS 对比实战
  16. 叶史瓦大学计算机科学,本地知名新西兰留学咨询平台排名
  17. 支付宝客户端架构解析:Android 客户端启动速度优化之「垃圾回收」
  18. 报错SyntaxError: Unexpected token T in JSON at position 0 at JSON.parse (<anonymous>)的解决方法
  19. python字符分割垂直投影法_Python实现投影法分割图像示例(一)
  20. 忆阻器交叉开关阵列中的长短期记忆(LSTM)神经网络

热门文章

  1. IBM X60驱动程序的安装
  2. OutLook中的live.cn(吐血配置)
  3. 一文看懂:零代码、0代码、无代码平台是什么?怎么选?
  4. ocdma相干非相干_相干成像与非相干成像系统的比较
  5. 混合策略纳什均衡——附例题及解析
  6. postgis routing pgr_dijkstra道路拓扑分析与方向分析
  7. matlab金字塔,高斯金字塔的matlab实现
  8. 一份门户网站SEO优化报告(附上海SEO评析)
  9. Web前端小白了解这些学习秘诀,你也能成为大神!
  10. Invalid prop: type check failed for prop “total“. Expected Number with value x, got String with valu