zoukankan      html  css  js  c++  java
  • LeetCode160 相交链表(双指针)

    题目:

    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;
        }
    }
  • 相关阅读:
    Java多线程:线程与进程
    Java多线程:线程间通信之volatile与sychronized
    Java基础:内存模型
    Windows10 ubuntu子系统的启用即基础配置
    Java基础:Java虚拟机(JVM)
    前序,中序,后序问题
    Java枚举enum以及应用:枚举实现单例模式
    Java外部类可以访问内部类private变量
    Java单例模式(Singleton)以及实现
    Java构造器:级联调用,调用兄弟构造器
  • 原文地址:https://www.cnblogs.com/sykline/p/12313938.html
Copyright © 2011-2022 走看看