题目
- 输入两个链表,找出它们的第一个公共结点
思路
方法一:暴力解决法,遍历第一个链表每个节点时,对应的遍历所有的另一个链表所有节点。时间复杂度为O(mn)
方法二:使用额外空间复杂度法:将两个链表遍历,并将遍历结果添加到两个栈中。根据先进后出的原则,判断每个栈顶的节点是否相同,如果相同则继续弹出,如果不相同,则找到最后一个相同的节点。空间复杂度为O(m+n),时间复杂度O(m+n)
方法三:不使用额外空间:判断两个链表的长度,并得到长度之间的差值,然后长链表先走差值步,最后如果出现节点相同,则输出结果
代码
- 方法三:
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
public class Solution {
public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
int length1 = getLength(pHead1);
int length2 = getLength(pHead2);
int lengthDif = length1-length2;
ListNode longlist = pHead1;
ListNode shortlist = pHead2;
//无法确定length1和length2 哪个更大
if(length1<length2){
lengthDif = length2-length1;
longlist = pHead2;
shortlist = pHead1;
}
for(int i=0;i<lengthDif;i++){
longlist = longlist.next;
}
while(longlist!=null && shortlist!=null && longlist!=shortlist){
longlist = longlist.next;
shortlist = shortlist.next;
}
ListNode firstCommonNode = longlist;
return firstCommonNode;
}
public int getLength(ListNode pHead){
int len=0;
while(pHead!=null){
len++;
pHead = pHead.next;
}
return len;
}
}