62.找出鏈表的第一個公共結點。
題目:兩個單向鏈表,找出它們的第一個公共結點
思路:
1.暴力法 但時間復雜度太高 o(n*m)
2.如果兩個鏈表有公共節點,則從該公共節點起,后面的節點均為公共的,即這兩個鏈表在第一個公共節點交叉,然后形成一個Y字型,因為兩個鏈表長度不一定一樣,所以可以先求得他們的長度n與m,然后得到長度差:Math.abs(n-m),然后先對較長鏈表先行遍歷n-m個節點,從第n-m+1個節點開始對這兩個鏈表遍歷,然后找出第一個相同的即可 (網上抄別人的)
3. 位圖法 對兩個鏈表分別建立bitmap,然后對這兩個bitmap進行與運算即可,則得到的結果中最左邊的那個1即代表第一個相同元素,然后對該值每次右移一位,直到等於1為止,右移的次數即為第一個公共元素,時間復雜度為o(n+m)
1 package com.rui.microsoft; 2 3 //62.找出鏈表的第一個公共結點。 4 //題目:兩個單向鏈表,找出它們的第一個公共結點 5 public class Test62_FindCommonNodeFromLinkedLists { 6 7 public static void main(String[] args) { 8 Node node1 = new Node(1); 9 Node node2 = new Node(2); 10 Node node3 = new Node(3); 11 node1.next = node2; 12 node2.next = node3; 13 14 Node node4 = new Node(4); 15 Node node5 = new Node(5); 16 Node nodeS = new Node(2); 17 Node node6 = new Node(1); 18 node4.next = node5; 19 node5.next = nodeS; 20 nodeS.next = node6; 21 22 Test62_FindCommonNodeFromLinkedLists app = new Test62_FindCommonNodeFromLinkedLists(); 23 app.find(node1, node4); 24 } 25 26 //位運算法 27 //時間復雜度o(n+m) => 遍歷鏈表構造bitmap 28 void find(Node headX, Node headY){ 29 Node x = headX; 30 Node y = headY; 31 32 int bitX = 0; 33 int bitY = 0; 34 35 while(null != x){ 36 bitX |= 1 << x.value; 37 x = x.next; 38 } 39 40 while(null != y){ 41 bitY |= 1 << y.value; 42 y = y.next; 43 } 44 45 System.out.println(Integer.toBinaryString(bitX)); 46 System.out.println(Integer.toBinaryString(bitY)); 47 48 int inter = bitX & bitY; 49 String interStr = Integer.toBinaryString(inter); 50 System.out.println(interStr); 51 52 int radix = 0; 53 while(inter > 1){ 54 inter >>= 1; 55 radix++; 56 } 57 System.out.println(radix); 58 } 59 60 static class Node { 61 int value; 62 Node next; 63 public Node(int v){ 64 this.value = v; 65 } 66 } 67 }