找出鏈表的第一個公共節點


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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM