其他分享
首页 > 其他分享> > 剑指offer 两个链表的第一个公共节点

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

作者:互联网

解法一:

/*
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;
 
    }
}

方法同上

标签:ListNode,val,offer,s1,链表,pHead1,pHead2,null,节点
来源: https://blog.csdn.net/chenziang1/article/details/123030411