题目描述
输入两个链表,找出它们的第一个公共结点。
解题思路
方法一:寻找公共结点,即这两个链表在此结点后,后续链表都相同,都是公共部分,所以我们可以从后往前找,找到最后一个是公共结点即满足条件。由于是单向链表,我们可以借助栈来实现。
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
import java.util.*;
public class Solution {
public ListNode FindFirstCommonNode(ListNode p1, ListNode p2) {
Stack<ListNode> s1 = new Stack<>();
Stack<ListNode> s2 = new Stack<>();
while(p1!=null){
s1.add(p1);
p1=p1.next;
}
while(p2!=null){
s2.add(p2);
p2=p2.next;
}
ListNode res =null;
while(!s1.isEmpty() && !s2.isEmpty() && s1.peek()==s2.peek()){
s1.pop();
res = s2.pop();
}
return res;
}
}
方法二:一个直观的想法是让两个链表从前往后走,边走边比较是否是公共结点。由于链表长度不一,可以让链表长的先走两个链表差的长度。
/*
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) {
int count1=0;
int count2=0;
ListNode p1=pHead1;
ListNode p2=pHead2;
while(p1!=null){
p1=p1.next;
count1++;
}
while(p2!=null){
p2=p2.next;
count2++;
}
if(count1>count2){
int len = count1-count2;
while(len>0){
pHead1 = pHead1.next;
len--;
}
}
if(count1<count2){
int len = count2-count1;
while(len>0){
pHead2 = pHead2.next;
len--;
}
}
while(pHead1!=null&&pHead2!=null){
if(pHead1 == pHead2)
return pHead1;
pHead1 = pHead1.next;
pHead2 = pHead2.next;
}
return null;
}
}