剑指 Offer 52. 两个链表的第一个公共节点——链表

剑指 Offer 52. 两个链表的第一个公共结点

方法一:
双指针解决方法

方法二:
通过集合set解决

先把第一个链表的节点全部存放到集合set中,然后遍历第二个链表的每一个节点,判断在集合set中是否存在,如果存在就直接返回这个存在的结点。如果遍历完了,在集合set中还没找到,说明他们没有相交,直接返回null即可

public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
    
    
    //创建集合set
    Set<ListNode> set = new HashSet<>();
    //先把链表A的结点全部存放到集合set中
    while (headA != null) {
    
    
        set.add(headA);
        headA = headA.next;
    }

    //然后访问链表B的结点,判断集合中是否包含链表B的结点,如果包含就直接返回
    while (headB != null) {
    
    
        if (set.contains(headB))
            return headB;
        headB = headB.next;
    }
    //如果集合set不包含链表B的任何一个结点,说明他们没有交点,直接返回null
    return null;
}

方法三:
先统计两个链表的长度

先统计两个链表的长度,如果两个链表的长度不一样,就让链表长的先走,直到两个链表长度一样,这个时候两个链表再同时每次往后移一步,看节点是否一样,如果有相等的,说明这个相等的节点就是两链表的交点,否则如果走完了还没有找到相等的节点,说明他们没有交点,直接返回null即可

public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
    
    
    //统计链表A和链表B的长度
    int lenA = length(headA), lenB = length(headB);

    //如果节点长度不一样,节点多的先走,直到他们的长度一样为止
    while (lenA != lenB) {
    
    
        if (lenA > lenB) {
    
    
            //如果链表A长,那么链表A先走
            headA = headA.next;
            lenA--;
        } else {
    
    
            //如果链表B长,那么链表B先走
            headB = headB.next;
            lenB--;
        }
    }

    //然后开始比较,如果他俩不相等就一直往下走
    while (headA != headB) {
    
    
        headA = headA.next;
        headB = headB.next;
    }
    //走到最后,最终会有两种可能,一种是headA为空,
    //也就是说他们俩不相交。还有一种可能就是headA
    //不为空,也就是说headA就是他们的交点
    return headA;
}

//统计链表的长度
private int length(ListNode node) {
    
    
    int length = 0;
    while (node != null) {
    
    
        node = node.next;
        length++;
    }
    return length;
}

猜你喜欢

转载自blog.csdn.net/qq_35655602/article/details/114239702