Leetcode刷题日记-No160相交链表

本文介绍了LeetCode第160题的解题思路,包括使用辅助空间的HashMap法和双指针法。两种方法的时间复杂度均为O(m+n),但空间复杂度不同,HashMap法为O(m+n),双指针法为O(1)。通过遍历链表并判断节点是否存在来找出相交部分。
摘要由CSDN通过智能技术生成

        题目地址:https://leetcode.cn/problems/intersection-of-two-linked-lists/

        思路一:辅助空间法。引入一个HashMap,遍历其中一个链表的所有节点,并将节点本身作为key存入HashMap。再遍历另一个链表的所有节点,如果节点已经在HashMap中存在,说明有相交,返回该节点;否则返回null。代码如下:

public class Solution {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        //构建用于存放headA所有节点的Hash表
        HashMap<ListNode, Integer> aNodes = new HashMap<ListNode, Integer>();
        while(headA != null) {
            aNodes.put(headA, 1);
            headA = headA.next;
        }
        //遍历headB找到headA中的节点就返回
        while(headB != null) {
            if(null != aNodes.get(headB)) {
                return headB;
            }else{
                headB = headB.next;
            }
        }
        return null;
    }
}

        时间复杂度:O(m+n)

        空间复杂度:O(m+n)

        思路二:双指针法。这里主要考虑的问题是A和B链表长度是不一样的,在遍历的时候,如果A到头了,就重新从headB开始;如果B到头了,就重新从headA开始,直到两个节点相等,此时如果是Null就说明不想交,否则说明相交。代码如下:

public class Solution {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        ListNode p1 = headA;
        ListNode p2 = headB;
        while(p1 != p2) {
            p1 = p1 == null ? headB : p1.next;
            p2 = p2 == null ? headA : p2.next;
        }
        return p1;
    }
}

        时间复杂度:O(m+n)

        空间复杂度:O(1)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值