剑指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