题目描述

编写一个程序,找到两个单链表相交的起始节点。

如下面的两个链表:

在节点 c1 开始相交。

输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3
输出:Reference of the node with value = 8
输入解释:相交节点的值为 8 (注意,如果两个列表相交则不能为 0)。从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,0,1,8,4,5]。在 A 中,相交节点前有 2 个节点;在 B 中,相交节点前有 3 个节点。

输入:intersectVal = 2, listA = [0,9,1,2,4], listB = [3,2,4], skipA = 3, skipB = 1
输出:Reference of the node with value = 2
输入解释:相交节点的值为 2 (注意,如果两个列表相交则不能为 0)。从各自的表头开始算起,链表 A 为 [0,9,1,2,4],链表 B 为 [3,2,4]。在 A 中,相交节点前有 3 个节点;在 B 中,相交节点前有 1 个节点。

输入:intersectVal = 0, listA = [2,6,4], listB = [1,5], skipA = 3, skipB = 2
输出:null
输入解释:从各自的表头开始算起,链表 A 为 [2,6,4],链表 B 为 [1,5]。由于这两个链表不相交,所以 intersectVal 必须为 0,而 skipA 和 skipB 可以是任意值。
解释:这两个链表不相交,因此返回 null。

注意:

如果两个链表没有交点,返回 null.
在返回结果后,两个链表仍须保持原有的结构。
可假定整个链表结构中没有循环。
程序尽量满足 O(n) 时间复杂度,且仅用 O(1) 内存。

思路分析:

根据题目意思
如果两个链表相交,那么相交点之后的长度是相同的 我们需要做的事情是,让两个链表从同距离末尾同等距离的位置开始遍历。这个位置只能是较短链表的头结点位置。
为此,我们必须消除两个链表的长度差: 指针 pA 指向 A 链表,指针 pB 指向 B 链表,依次往后遍历
如果 pA 到了末尾,则 pA = headB 继续遍历
如果 pB 到了末尾,则 pB = headA 继续遍历
比较长的链表指针指向较短链表head时,长度差就消除了
如此,只需要将最短链表遍历两次即可找到位置

大白话就是:我先走我的路,再走你的路,你先走你的路,再走我的路,这样咱俩走的路程就一样了,速度一样,那么肯定在咱俩两条路的交叉口相遇,并一起肩并肩走向终点。

代码实现:

/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public static ListNode getIntersectionNode(ListNode headA, ListNode headB) { if (headA == null || headB == null) {
return null;
} //双指针;pNode指向A链表,qNode指向B链表
ListNode pNode = headA;
ListNode qNode = headB;
while (pNode != qNode) {
pNode = pNode == null ? headB : pNode.next;
qNode = qNode == null ? headA : qNode.next;
}
return pNode;
}
}

空间复杂度: O(1)
时间复杂度为: O(n)

最新文章

  1. JSP页面转向方式
  2. AIX 下某些日志定时清空
  3. Spring AOP 创建增强类
  4. Textbox像百度一下实现下拉显示 z
  5. WebApp开发之Cordova安装教程
  6. JAVA计算器算法实现
  7. linux dump 命令详解
  8. MyBatis原始dao开发及问题总结(五)
  9. 201521123070 《JAVA程序设计》第1周学习总结
  10. [洛谷P2234][HNOI2002] 营业额统计 - Treap
  11. maven引入本地jar 打jar包
  12. python: 列表的方法
  13. Chapter 1 An Overview of Computers and Programming Languages
  14. 大部分教程不会告诉你的 12 个 JS 技巧
  15. [20181219]script使用小技巧.txt
  16. Nginx详解二十二:Nginx深度学习篇之Lua解释器安装及基础语法
  17. Android_TextView使用Spanable
  18. windows cmd相关操作
  19. Linux mii-tool 命令
  20. Bootstrap框架常用总结

热门文章

  1. luogu4302字符串折叠题解--区间DP
  2. window上mongoDB的安装及常用mongodb命令
  3. bash shell脚本之成员变量
  4. Java攻城狮面试题录:笔试篇(1)
  5. Hadoop_24_MapReduce实现QQ共同好友
  6. swagger2注解使用方法
  7. HDU 5876 补图最短路
  8. MAC 环境下搭建HttpRunnerManager平台
  9. marquee标签实现跑马灯效果--无缝滚动
  10. 关于C++编译时内链接和外链接