剑指offer 两个链表的第一个公共节点

本文探讨了两种方法解决链表相交问题:一种是利用栈实现逐节点对比,另一种是借助HashSet进行快速查找。通过实例代码展示了如何在Java中找到两个链表的第一个公共节点。

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

解法一:

/*
public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}*/
import java.util.*;
public class Solution {
    public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
        if(pHead1==null || pHead2==null){
            return null;
        }
        LinkedList<ListNode> s1=new LinkedList<>();
        LinkedList<ListNode> s2=new LinkedList<>();
        while(pHead1!=null){
            s1.addLast(pHead1);
         
            pHead1=pHead1.next;
        }
        while(pHead2!=null){
            s2.addLast(pHead2);
            pHead2=pHead2.next;
        }
         ListNode ans=null;
        while((s1.isEmpty()==false&&s2.isEmpty()==false)&&s1.getLast()==s2.getLast()){
            ans=s1.getLast();
            s1.removeLast();
            s2.removeLast();
        }
        
        return ans;
        
        
        
        
    }
}

首先我们考虑一般的情况,我们只需要把两个链表分别存储进两个栈里面,然后从后往前比较,第一个不是相同的节点就是我们需要的节点。

接下来考虑特殊情况:

1.某一个list为空那么就直接返回空

2. 一个链表包含另一个链表的时候

这个就是为什么最后的循环需要加s1.empty()的原因

方法二:

用set

/*
public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}*/
import java.util.*;
public class Solution {
    public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
        HashSet<ListNode> s=new HashSet<>();
        ListNode temp1=pHead1;
        ListNode temp2=pHead2;
        while(temp1!=null){
            s.add(temp1);
            temp1=temp1.next;
        }
        while(temp2!=null){
        if(s.contains(temp2)){
        return temp2;
        }
        else{
        temp2=temp2.next;
        }
        }
        
        return null;
 
    }
}

方法同上

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值