题目:

click here!!题目传送门

思路:

1.笨方法

因为如果两个链表相交的话,从相交的地方往后是同一条链表,所以:

分别遍历两个链表,得出两个链表的长度,两个长度做差得到n,然后将长的链表头指针先移动n个结点,然后两个链表再同时移动,如果出现两个链表的指针直到同一个内存地址,说明相交,没有出现指向同一个内存地址的情况就是不相交

class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
int lenA = 0,lenB = 0, len = 0;
ListNode tA = headA;
ListNode tB = headB;
while(tA != null){
lenA++;
tA = tA.next;
}
while(tB != null){
lenB++;
tB = tB.next;
}
len = Math.max(lenA,lenB) - Math.min(lenA,lenB);
if(lenA > lenB){
lenA = 0;
while (lenA < len){
headA = headA.next;
lenA++;
}
}else{
lenB = 0;
while (lenB < len){
headB = headB.next;
lenB++;
}
}
while (headA != headB){
headA = headA.next;
headB = headB.next;
if(headA == null || headB==null) return null;
}
return headA;
}
}

2 巧方法

和方法1中一样首先将两个链表的指针之间的长度差消除,这里可以这样来做:

两个链表的指针同时向后移动,在链表A指针移动到表尾的时候令指针指向链表B;链表B指针移动到表尾的时候令指针指向链表A的表头。如果两个链表相交的话,则在较长的链表的指针转向较短链表表头的时候,较短链表的指针已经在长链表上走过两链表的长度差n个节点了,也就是说,现在两个指针处于同一起跑线上。(对着原题目的图走一遍就明白了)

长链表的指针从长链表起步就多走了n个节点,转到短链表上又少走了n个;短链表的指针从短链表起步就少走了n个节点,转到长链表上时,有多走了n个节点,所以两者会同时处于同一起跑线上。

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

LeetCode160 相交链表(双指针)的更多相关文章

  1. [LeetCode题解]160. 相交链表 | 双指针 + 哈希表

    方法一:双指针 解题思路 假设链表存在相交时,headA 的长度为 a + c,headB 的长度为 b + c.如果把 headA 连上 headB,headB 连上 headB 的话,当遍历这两个 ...

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

    Write a program to find the node at which the intersection of two singly linked lists begins. For ex ...

  3. LeetCode160.相交链表

    编写一个程序,找到两个单链表相交的起始节点. 例如,下面的两个链表: A: a1 → a2 ↘ c1 → c2 → c3 ↗ B: b1 → b2 → b3 在节点 c1 开始相交. 注意: 如果两个 ...

  4. 【LeetCode题解】160_相交链表

    目录 160_相交链表 描述 解法一:哈希表 思路 Java 实现 Python 实现 解法二:双指针(推荐) 思路 Java 实现 Python 实现 160_相交链表 描述 编写一个程序,找到两个 ...

  5. LeetCode 160: 相交链表 Intersection of Two Linked Lists

    爱写Bug(ID:iCodeBugs) 编写一个程序,找到两个单链表相交的起始节点. Write a program to find the node at which the intersectio ...

  6. LeetCode 160——相交链表(JAVA)

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

  7. leetcode腾讯精选练习之相交链表(六)

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

  8. Java实现 LeetCode 160 相交链表

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

  9. 【LeetCode】Intersection of Two Linked Lists(相交链表)

    这道题是LeetCode里的第160道题. 题目讲的: 编写一个程序,找到两个单链表相交的起始节点. 如下面的两个链表: 在节点 c1 开始相交. 示例 1: 输入:intersectVal = 8, ...

随机推荐

  1. ls命令与cd命令

    ls命令用于显示文件目录列表,当使用ls命令时,默认显示的只有非隐藏文件或文件夹(隐藏文件在linux中前面有 ' . ' ),当不加参数时,显示当前目录. 1.ls命令语法 ls [参数][目标文件 ...

  2. Py西游攻关之基础数据类型(三)-元组

    Py西游攻关之基础数据类型 - Yuan先生 https://www.cnblogs.com/yuanchenqi/articles/5782764.html 六 tuple(元组) 元组被称为只读列 ...

  3. 记一个 protobuf 的 jar 包冲突

    尝试使用 spark 以 bulkload 的方式写 HBase 时,遇到一个问题,错误堆栈如下 19/02/02 09:00:43 ERROR Utils: Aborting task java.l ...

  4. 中山普及Day13——普及

    又是迷之自信的说...估的230,考的50整,我欲上天呐!!! T1:深渊(怕不是黑暗种族聚集地???) 思路:动归.而且是简单动归.转移方程:Fi,j=max(Fi-1,j,Fi,j,Fi-1,(j ...

  5. ubuntu18.04下安装node

    安装Node.js Ubuntu 18.04在其默认存储库中包含一个版本的Node.js,可用于在多个系统间提供一致的体验. 在撰写本文时,存储库中的版本是8.10.0. 这不会是最新的版本,但它应该 ...

  6. Random Variables

    可测空间(Measurable Space)和测度空间(Measure Space) 集合X,X上的一个σ-algebra A,则(X,A)被称为可测空间(measurable space) 再在A上 ...

  7. 三、java基础-方法含义_重载_递归

    1.java中方法: 方法的含义: 就是一个代码片段,可以完后某个特定的功能,可以重复利用: 定义方法的语法: [方法的修饰符列表]   方法的返回值类型   方法名{    java语句; } 注意 ...

  8. JS弹出层制作,以及移动端禁止弹出层下内容滚动,overflow:hidden移动端失效问题

    HTML <div class="layer"> <div class="menu-list"> <span>社会</ ...

  9. linux 串口 拼帧处理

    串口每次read数据可能不是完整的数据,参照网上的代码,写了拼帧的代码#include <stdio.h> #include <termios.h> #include < ...

  10. Docker 镜像文件的导入和导出

    使用save命令 保存镜像 docker save -o name_by_you.tar exist_images 将文件copy到另一台机器 使用load命令将镜像文件保存到本地仓库 docker ...