方法是使用快慢指針,經過一個slow指針(每次都指向下一個),一個quick指針(每次都指向下面兩個)java
由於假設有環的話,quick會追上slow指針node
找到環出口就是經過slow指針指向頭節點,quick指針指向以前環的交叉點,而後一直以相同速度(慢指針的速度)ui
遍歷直到相遇這樣找到的就是出口節點this
ps:慢指針遍歷速度爲每次一個節點,快指針則是遍歷兩個節點spa
java實現方法以下指針
1 2 3 import org.junit.Test; 4 5 public class Main5 { 6 // node 7 private static class node { 8 int val; 9 node next = null; 10 11 public node(int a) { 12 this.val = a; 13 } 14 } 15 16 // 17 public static node create() { 18 // 建立 19 node first = new node(0); 20 node node = first; 21 int i = 1; 22 while (i < 10) { 23 node.next = new node(i); 24 node = node.next; 25 i++; 26 } 27 i = 0; 28 node node2 = first; 29 while (i < 6) { 30 if (i == 5) { 31 node.next = node2; 32 } else { 33 node2 = node2.next; 34 } 35 i++; 36 } 37 38 return first; 39 } 40 // 41 @Test 42 public void test_circle() { 43 node first = create(); 44 // 快慢指針方法判斷是否爲環 45 node quick = first; 46 node slow = first; 47 int i = 0; 48 while (i < 1000) { 49 quick = quick.next.next; 50 slow = slow.next; 51 if (quick == slow) { 52 System.out.println("這個是一個環"); 53 break; 54 } 55 i++; 56 } 57 } 58 // 59 //主要是經過快慢指針來判斷,慢指針從first節點觸發,快指針從交叉點出發,最後的交點就是出口節點 60 @Test 61 public void test_getNode() { 62 node first = create(); 63 64 // 快慢指針方法判斷是否爲環 65 node jiaodian = null; 66 node quick = first; 67 node slow = first; 68 int i = 0; 69 while (i < 1000) { 70 quick = quick.next.next; 71 slow = slow.next; 72 if (quick == slow) { 73 break; 74 } 75 i++; 76 } 77 // 78 slow = first; 79 while(i<1000) { 80 slow = slow.next; 81 quick = quick.next; 82 if(slow == quick) { 83 System.out.println("出口節點"+slow.val); 84 break; 85 } 86 } 87 } 88 }
判斷仍是很簡單的,只要將兩個鏈表遍歷到尾節點,若是尾節點相同,這樣就證實這兩個鏈表是有交點的code
如何找到兩個鏈表相交的節點?blog
方法:遍歷兩個鏈表的長度,而後長鏈表長度減去短鏈表長度爲K,讓長鏈表減去K,而後兩個鏈表逐個對比ci
Java代碼get
1 @Test 2 public void test() { 3 //建立兩個鏈表 4 node first1 = new node(0); 5 node node1 = first1; 6 node first2 = new node(0); 7 node node2 = first2; 8 int i=0; 9 while(i<5) { 10 node1.next = new node(i); 11 i++; 12 } 13 i=0; 14 while(i<5) { 15 node2.next = new node(i); 16 i++; 17 } 18 node ban = new node(6); 19 node node3 = ban; 20 i=0; 21 while(i<5) { 22 node3 = new node(i+5); 23 i++; 24 } 25 node1.next = ban; 26 node2.next = ban; 27 // 28 //這裏是判斷 29 int length_1 = 0; 30 int length_2 = 0; 31 node1 = first1; 32 node2 = first2; 33 while(node1 != null) { 34 length_1++; 35 node1 = node1.next; 36 } 37 while(node2 != null) { 38 length_2++; 39 node2 = node2.next; 40 } 41 42 int k = 0; 43 if(length_1>=length_2) { 44 k = length_1-length_2; 45 int j = 0; 46 while(j<k) { 47 first1 = first1.next; 48 j++; 49 } 50 }else { 51 k = length_2 - length_1; 52 int j = 0; 53 while(j<k) { 54 first2 = first2.next; 55 j++; 56 } 57 } 58 while(true) { 59 if(first1 == first2) { 60 System.out.println("共同節點"+first1.val); 61 break; 62 } 63 first1 = first1.next; 64 first2 = first2.next; 65 } 66 }