160--Intersection Of Two Linked List

本文介绍了三种求解两个链表交点的算法,包括暴力遍历、哈希表求解及双指针技巧。详细解析了每种方法的时间与空间复杂度,展示了不同策略下寻找链表交点的具体实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

public class IntersectionOfTwoLinkedList {
    /*
    解法一:暴力遍历求交点。
            时间复杂度:O(m*n)  空间复杂度:O(1)
     */
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        if(headA==null||headB==null)
            return null;
        if (headA==headB)
            return headA;
        ListNode tempA=headA;
        ListNode tempB=headB;
        while (tempA!=null){
            tempB=headB;
            while (tempB!=null){
                if (tempA==tempB)
                    return tempA;
                tempB=tempB.next;
            }
            tempA=tempA.next;
        }
        return null;
    }
    /*
    解法二:哈希表求解,思想和解法一差不多,将B存入哈希表,遍历A的节点看是否存在于B
            时间复杂度:O(m+n) 空间复杂度:O(m)或O(n)
     */
    public ListNode getIntersectionNode2(ListNode headA, ListNode headB) {
        if(headA==null||headB==null)
            return null;
        if (headA==headB)
            return headA;
        Set<ListNode> set=new HashSet<>();
        ListNode tempB=headB;
        while (tempB!=null){
            set.add(tempB);
            tempB= tempB.next;
        }
        ListNode tempA=headA;
        while (tempA!=null){
            if (set.contains(tempA))
                return tempA;
            tempA= tempA.next;
        }
        return null;
    }
    /*
    解法三:双指针:当两个链表长度相等时,只需要依次移动双指针,当指针指向的节点相同时,则有交点。
                    但是问题就在于,两个链表的长度不一定相等,所以就要解决它们的长度差。
                    一个字概述这个解法:骚。
     */
    public ListNode getIntersectionNode3(ListNode headA, ListNode headB) {
        if (headA==null||headB==null)
            return null;
        ListNode pA=headA;
        ListNode pB=headB;
        while (pA!=pB){
            pA=pA==null?headB:pA.next;
            pB=pB==null?headA:pB.next;
        }
        return pA;
    }
}

 

转载于:https://www.cnblogs.com/zhangyuhao/p/11452441.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值