zoukankan      html  css  js  c++  java
  • 找出链表的第一个公共节点

    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 }
  • 相关阅读:
    codevs 1576 最长严格上升子序列
    codevs 3415 最小和
    codevs 2102 石子归并 2
    洛谷 P1040 加分二叉树
    BZOJ 3038 上帝造题的七分钟二
    codevs 线段树练习ⅠⅡⅢ
    启动Tomcat提示:指定的服务未安装
    poj 1061 青蛙的约会 (扩展欧几里得模板)
    POJ 3449 Geometric Shapes(判断几个不同图形的相交,线段相交判断)
    HDU 5251 矩形面积(二维凸包旋转卡壳最小矩形覆盖问题) --2015年百度之星程序设计大赛
  • 原文地址:https://www.cnblogs.com/aalex/p/5019932.html
Copyright © 2011-2022 走看看