单链表中的简单算法
/**
* 得到两个单链表的公共结点
* 先求出两个链表的长度,并求出二者的差值dif,两个指针分别指向链表头部,让指向长的链表的指针先向链表尾部移动dif步。
* 最后一起一步步移动两个指针,当两个指针都指向同一个结点时,返回那个结点
* @param list1
* @param list2
* @return
*/
public static ListNode getFirstCommonNode(ListNode list1,ListNode list2){
if(list1==null || list2==null){
return null;
}
int length1 = getListLength(list1);
int length2 = getListLength(list2);
ListNode longList = list2;
ListNode shortList = list1;
int dif = length2 - length1;
if(length1 > length2){
longList = list1;
shortList = list2;
dif = length1 - length2;
}
while(dif>0){
longList = longList.getNext();
dif--;
}
while(longList!=null && shortList!=null && longList!=shortList){
longList = longList.getNext();
shortList = shortList.getNext();
}
return longList;
}
/**
* 得到链表的长度
* @param list
* @return
*/
public static int getListLength(ListNode list){
int length = 0;
while(list != null){
length++;
list = list.getNext();
}
return length;
}