單鏈表中的簡單算法
/**
* 得到兩個單鏈表的公共結點
* 先求出兩個鏈表的長度,並求出二者的差值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;
}