【LeetCode - Java】160. 相交链表 (简单)

目录

    • 1. 题目描述
    • 2. 解题思路
    • 3. 代码实现
      • 3.1 HashSet
      • 3.2 双指针
      • 3.3 对比

1. 题目描述

【LeetCode - Java】160. 相交链表 (简单)_第1张图片

2. 解题思路

对于这类型判断节点有没有visited的题目,哈希表应该是刻在DNA中的自然反应了,思路也没什么特别之处,而通常这类型题目需要压缩内存消耗的话,大多是需要依靠指针进行,这里也不例外,利用双指针分别同时进行遍历。

这样做有一个问题,假如相交节点的前驱结点数目不同,没办法同时到达相交节点,这怎么办呢? 这其实正是这个思路的难点,也是巧妙之处

假如以相交节点为分界点,链表A分为a+b两段,链表B分为c+b两段,若a=c则没有这个问题,棘手在于a≠c的时候,我们需要再交叉遍历一次,什么意思呢?就是一个指针的走向是a-b-c另一个指针的走向是c-b-a,这样一来就能够同时到达相交节点了,即使是不存在相交节点,那么路径会是a-b-c-bc-b-a-b,也同样可以作出判断。

3. 代码实现

3.1 HashSet

public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        HashSet<ListNode> nodeSet = new HashSet<>();
        while (headA != null) {
            nodeSet.add(headA);
            headA = headA.next;
        }
        while (headB != null) {
            if (!nodeSet.add(headB))
                return headB;
            headB = headB.next;
        }
        return null;
    }

3.2 双指针

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

【LeetCode - Java】160. 相交链表 (简单)_第2张图片

3.3 对比

虽然两者的时间复杂度都是O(m+n),但在hashset中还需要进行存储操作,这应该是造成时间差异的主要原因。而hashset的空间复杂度是O(m+n),其实是可以做到O(m) 的,我是看了官解后恍然大悟,而双指针只需要存储两个指针,空间复杂度是O(1)
【LeetCode - Java】160. 相交链表 (简单)_第3张图片

你可能感兴趣的:(LeetCode,-,Java,链表,java,leetcode)