LeetCode-160. 相交链表-Java实现

实现效果

在这里插入图片描述

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

参考原型代码:

 public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        /**
        定义两个指针, 第一轮让两个到达末尾的节点指向另一个链表的头部, 最后如果相遇则为交点(在第一轮移动中恰好抹除了长度差)
        两个指针等于移动了相同的距离, 有交点就返回, 无交点就是各走了两条指针的长度
        **/
        if(headA == null || headB == null) return null;
        ListNode pA = headA, pB = headB;
        // 在这里第一轮体现在pA和pB第一次到达尾部会移向另一链表的表头, 而第二轮体现在如果pA或pB相交就返回交点, 不相交最后就是null==null
        while(pA != pB) {
            pA = pA == null ? headB : pA.next;
            pB = pB == null ? headA : pB.next;
        }
        return pA;
    }

过程

因为好久没有接触数据结构和算法了,所以这题一上来还是参考大佬的,话说大佬的代码真的是好看啊,题目我一开始理解错了,正解是两个链表第一个相遇点之后所有节点都一样。大佬的是思路是走两轮,第一轮同步走,如果两个链表相长度也一样,相遇位置则也一样(相对于起始点),如果长度一样不相交,则最后同步达到NULL,这样第一轮主要用来判断长度一样的情况。每一个链表第一轮走完后,跳到另一个链表的头节点,这样做的目的就是把长度不一样的情况中两个链表的长度差磨平,相当于构造两个链表,一个是A+B-重合长度,另一个是B+A-重合长度,重合长度一样,所以如果相交的话肯定能同步达到相交位置,不相交的话,同时达到NULL。

猜你喜欢

转载自blog.csdn.net/ws948342046/article/details/87182365