找出链表的第一个公共节点
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 }