找出链表的第一个公共节点

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 }

 

posted @ 2015-12-04 17:12  蟹粉小笼包  阅读(2119)  评论(0编辑  收藏  举报