【LeetCode】两个链表的第一个公共节点Java题解

674 阅读2分钟

这是我参与8月更文挑战的第26天,活动详情查看:8月更文挑战

题目描述

输入两个链表,找出它们的第一个公共节点。

示例 1:


输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3
输出:Reference of the node with value = 8
输入解释:相交节点的值为 8 (注意,如果两个列表相交则不能为 0)。从各自的表头开始算起,链表 A[4,1,8,4,5],链表 B[5,0,1,8,4,5]。在 A 中,相交节点前有 2 个节点;在 B 中,相交节点前有 3 个节点。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/liang-ge-lian-biao-de-di-yi-ge-gong-gong-jie-dian-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路分析

  • 链表是常见的数据存储结构,通过指针来连接元素,链表可以方便地删除、插入数据,时间复杂度是O(1)。

  • 今天的题目的首先要理解的一点是第一个公共节点不仅仅是值相等,地址也需要相等

  • 我们可以使用hashSet存储节点,也可以是用双指针方法解决。采用双指针解法的思路是将两个链表拼接在一起,然后去找公共部分。

代码

  • hashSet解法
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        if (headA == null || headB == null) {
            return null;
        }
        Set<ListNode> set = new HashSet<>();
        while (headA != null) {
            set.add(headA);
            headA = headA.next;
        }
        while (headB != null) {
            if (set.contains(headB)) {
                return headB;
            }
            headB = headB.next;
        }
        return null;
    }
}
  • 双指针解法
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        if (headA == null || headB == null) {
            return null;
        }
        ListNode p1 = headA, p2 = headB;
        while (p1 != p2) {
            p1 = (p1 == null) ? headB : p1.next;
            p2 = (p2 == null) ? headA : p2.next;
        }

        return p1;
    }
}

总结

  • hashSet 解法的时间复杂度是O(n) , 空间复杂度是 O(n)
  • 双指针解法的时间复杂度是 O(n), 空间复杂度是O(1)
  • 坚持算法每日一题,加油!