• 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;
        }
    }
  • 相关阅读:
    组合容斥计数技巧
    [BZOJ3456]城市规划:DP+NTT+多项式求逆
    [BZOJ4456][ZJOI2016]旅行者:分治+最短路
    [51nod1383&1048]整数分解为2的幂:DP
    [BZO3572][HNOI2014]世界树:虚树+倍增
    树上最小权链覆盖:可并堆
    [BZOJ4237]稻草人:CDQ分治+单调栈
    [BZOJ3453]tyvj 1858 XLkxc:拉格朗日插值
    [BZOJ5463][APIO2018]铁人两项:Tarjan+圆方树
    [BZOJ4695]最假女选手:segment tree beats!
  • 原文地址:https://www.cnblogs.com/sykline/p/12313938.html
Copyright © 2020-2023  润新知