LeetCode面试题02.07.链表相交

面试题02.07.链表相交

两种解题思路

  • 面试题02.07.链表相交
    • 一、双指针
    • 二、哈希集合

LeetCode面试题02.07.链表相交_第1张图片

LeetCode面试题02.07.链表相交_第2张图片

LeetCode面试题02.07.链表相交_第3张图片

一、双指针

这道题简单来说,就是求两个链表交点节点的指针

这里注意:交点不是数值相等,而是指针相等

为了方便举例,假设节点元素数值相等,则节点指针相等

看如下两个链表,如前curA指向链表A的头结点,curB指向链表B的头结点

LeetCode面试题02.07.链表相交_第4张图片

我们求出两个链表的长度,并求出两个链表长度的差值,然后让curA移动到和curB对齐的位置,如图所示

LeetCode面试题02.07.链表相交_第5张图片

此时我们就可以比较curA和curB是否相同,如果不相同,同时向后移动curA和curB,如果遇到curA==curB,则找到交点

否则循环退出,返回空指针

    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        ListNode curA = headA;
        ListNode curB = headB;
        int lenA = 0,lenB = 0;
        //求链表A的长度
        while(curA!=null){
            lenA++;
            curA = curA.next;
        }
        //求链表B的长度
        while(curB!=null){
            lenB++;
            curB = curB.next;
        }
        curA = headA;
        curB = headB;
        //让curA成为最长链表的头,lenA为其长度
        if(lenB>lenA){
            //交换lenA和lenB的值
            int tempLen = 0;
            tempLen = lenA;
            lenA = lenB;
            lenB = tempLen;
            //交换curA和curB指针
            ListNode tempNode = curA;
            curA = curB;
            curB = tempNode;
        }
        //求长度差
        int gap = lenA-lenB;
        //让curA和curB对齐
        while(gap>0){
            curA = curA.next;
            gap--;
        }
        //遍历curA和curB,遇见相同val值则直接返回
        while(curA!=null){
            //注意是指针相等
            if(curA==curB){
                return curA;
            }
            curA = curA.next;
            curB = curB.next;
        }
        return null;
    }

二、哈希集合

判断两个链表是否相交,可以使用哈希集合存储链表节点

首先遍历链表headA,并将链表headA中的每个节点加入到哈希集合中

然后遍历链表headB,对于遍历到的每个节点,判断该节点是否在哈希集合中

  • 如果当前节点不在哈希集合中,则继续遍历下一个节点
  • 如果当前节点在哈希集合中,则后面的节点都在哈希集合中,即从当前节点开始的所有节点都在两个链表的相交部分,因此在链表headB中遍历到的第一个在哈希集合中的节点就是两个链表相交的节点,返回该节点
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        Set<ListNode>visited = new HashSet<ListNode>();
        ListNode temp = headA;
        while(temp!=null){
            visited.add(temp);
            temp = temp.next;
        }
        temp = headB;
        while(temp!=null){
            if(visited.contains(temp)){
                return temp;
            }
            temp = temp.next;
        }
        return null;
    }

你可能感兴趣的:(算法实战,leetcode,链表,算法,数据结构,力扣,java)