1.题目
公共结点后面的结点都是相同的
思路:第一种暴力法,每个结点和另外一个链表的所有的结点比较
第二种栈法,把两个链表的结点放入栈中,利用后进先出的特点进行比较,需要额外的空间花费O(m+n)
第三种就是遍历法,不需要花费空间
2.解法
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
public class Solution {
public int calLength(ListNode pHead){
int len = 0;
// pHead就是第一个结点,不是假结点
ListNode p = pHead;
while(p != null){
++len;
p = p.next;
}
return len;
}
public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
// 1.遍历两个链表,获得长度
int l1 = calLength(pHead1);
int l2 = calLength(pHead2);
// 2.默认规定链表的长短,如果不是,则交换
ListNode longNode = pHead1;
ListNode shortNode = pHead2;
int sub = l1 - l2;
if(l2 > l1){
longNode = pHead2;
shortNode = pHead1;
sub = l2 - l1;
}
// 3.长的链表先走几步
while(sub != 0){
longNode = longNode.next;
--sub;
}
// 4.寻找相同的结点,让循环继续的条件就是不相等
while(longNode != null && shortNode != null){
if(longNode.val != shortNode.val){
longNode = longNode.next;
shortNode = shortNode.next;
}else{
return longNode;
}
}
return null;
}
}
时间复杂度为O(m+n),空间复杂度为O(1)