java實現---判斷兩個連結串列是否相交,若相交,求交點(假設連結串列不帶環)
阿新 • • 發佈:2019-01-01
有兩個單鏈表,判斷它們是否相交,若相交,求交點
第一步判斷兩個連結串列是否相交
-
如果兩個連結串列相交,那麼它們的最後一個節點肯定是同一個節點,如下圖展示
-
我們可以分別遍歷兩個連結串列,直到最後一個節點
-
當最後兩個是同一個節點時,則說明相交
public static boolean IsPoint(ListNode first,ListNode head){ ListNode forward = first; ListNode backward = head; if((first == null)||(head == null)){ return false; } while(first != null){ first = first.next; } while(head != null){ head = head.next; } return first == head; }
- 當返回值為true時,則說明相交
第二步求交點
- 先求出兩個連結串列的長度
- 當兩個等長時,則兩個節點同時往後走,當走到同一個時,返回該節點,則為交點
- 當不等長時,首先求出長度之差diff,然後讓長的連結串列先走diff步,接著,兩個同時走,走到同一個時,返回其中一個節點,則為交點
public class Link{ public static int Length(ListNode list){ //求兩個連結串列的長度 int count = 0; while(list != null){ list = list.next; count++; } return count; } public static ListNode Point(ListNode list1,ListNode list2){ int len1 = Length(list1); int len2 = Length(list2); ListNode longL = list1; ListNode shortL = list2; int diff = len1 -len2; if(len2 > len1){ longL = list2; shortL = list1; diff = len2 -len1; } //長的連結串列定為longL遍歷 短的shortL遍歷 while(diff-- != 0){ longL = longL.next; } while(true){ if(longL == shortL){ return longL; } longL = longL.next; shortL = shortL.next; } }
- 測試
// public static void main(String[] args) { // ListNode n1 = new ListNode(); // ListNode n2 = new ListNode(); // ListNode n3 = new ListNode(); // ListNode n4 = new ListNode(); // n1.data = 2; // n2.data = 2; // n3.data = 3; // n4.data = 4; // n1.next = n2; // n2.next = n3; // n3.next = n4; // ListNode n5 = new ListNode(); // ListNode n6 = new ListNode(); // ListNode n7 = new ListNode(); // ListNode n8 = new ListNode(); // n5.data = 1; // n6.data = 2; // n7.data = 7; // n8.data = 8; // n5.next = n6; // n6.next = n7; // n7.next = n8; // IsPoint(n1,n5); // } //}