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 }
  • 相关阅读:
    leetcode108 Convert Sorted Array to Binary Search Tree
    leetcode98 Validate Binary Search Tree
    leetcode103 Binary Tree Zigzag Level Order Traversal
    leetcode116 Populating Next Right Pointers in Each Node
    Python全栈之路Day15
    Python全栈之路Day11
    集群监控
    Python全栈之路Day10
    自动部署反向代理、web、nfs
    5.Scss的插值
  • 原文地址:https://www.cnblogs.com/aalex/p/5019932.html
Copyright © 2011-2022 走看看