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;
    }
}

猜你喜欢

转载自www.cnblogs.com/sykline/p/12313938.html