zoukankan      html  css  js  c++  java
  • PAT 1032 (未完成)

      斗智斗勇系列,这个时间限制太变态了,10^5的数据读进去100ms就完蛋,buffer又不能太多开,但是8M buffer开出来其实也没啥用,还是超时

      除去超时数据点,还有一个数据点没有过,不知道是什么边界条件,不管了

      判断两条链表是否相交,首先两条链表都走到最后一个节点,如果节点相同,则说明这两条链表是相交的。算出两条链表的长度,len1,len2,max(len1, len2) - min(len1, len2),长的链表先走diff step,再和短的链表一起走,相遇的节点即为共同节点的起始节点。

      另外学到了,PAT中的JAVA如果是返回非零,则说明存在着异常。前面有数据点返回非零是因为没有判断null。

      

      

      1 import java.util.*;
      2 import java.io.*;
      3 
      4 class FastReader{
      5     BufferedReader reader;
      6     StringTokenizer tokenizer;
      7     
      8     public FastReader(InputStream stream){
      9         reader = new BufferedReader(new InputStreamReader(stream), 1 << 22);
     10         tokenizer = null;
     11     }
     12     
     13     public String next(){
     14         while (tokenizer == null || !tokenizer.hasMoreTokens()){
     15             try { 
     16                 tokenizer = new StringTokenizer(reader.readLine());
     17             } catch (Exception e){
     18                 //System.out.println(-1);
     19                 throw new RuntimeException(e);
     20             }
     21         }
     22         
     23         return tokenizer.nextToken();
     24     }
     25     
     26     public int next_int(){
     27         return Integer.parseInt(next());
     28     }
     29 }
     30 
     31 class Node{
     32     int address;
     33     int next_address;
     34     Node next;
     35     
     36     public Node(){
     37         next = null;
     38     }
     39 }
     40 
     41 public class Main {
     42     public static void main(String[] args){
     43         FastReader reader = new FastReader(System.in);
     44         int first_start, second_start;
     45         int N;
     46         
     47         first_start = reader.next_int();
     48         second_start = reader.next_int();
     49         N = reader.next_int();
     50         
     51         Node[] nodes = new Node[N];
     52         
     53         for (int i = 0; i < N; i++){
     54             int cur_address = reader.next_int();
     55             reader.next();
     56             int next_address = reader.next_int();
     57             
     58             Node node = new Node();
     59             node.address = cur_address;
     60             node.next_address = next_address;
     61             nodes[i] = node;
     62         }
     63         
     64         Node first_word = null, second_word = null;
     65         for (int i = 0; i < N; i++){
     66             Node cur_node = nodes[i];
     67             if (cur_node.address == first_start)
     68                 first_word = cur_node;
     69             else if (cur_node.address == second_start)
     70                 second_word = cur_node;
     71             for (int j = 0; j < N; j++){
     72                 Node candidate_node = nodes[j];
     73                 
     74                 if (cur_node.next_address == candidate_node.address){
     75                     cur_node.next = candidate_node;
     76                     break;
     77                 }
     78             }
     79         }
     80         
     81         int len1 = 0, len2 = 0;
     82         Node first_ptr = first_word, second_ptr = second_word;
     83         
     84         if (first_ptr == null || second_ptr == null){
     85             System.out.println(-1);
     86             return;
     87         }
     88         
     89         while (first_ptr.next != null){
     90             first_ptr = first_ptr.next;
     91             len1++;
     92         }
     93         while (second_ptr.next != null){
     94             second_ptr = second_ptr.next;
     95             len2++;
     96         }
     97         
     98         if (first_ptr != second_ptr){
     99             System.out.println(-1);
    100             return;
    101         }
    102         
    103         int diff_step = Math.max(len1, len2) - Math.min(len1, len2);
    104         if (len1 < len2){
    105             first_ptr = second_word;
    106             second_ptr = first_word;
    107         } else {
    108             first_ptr = first_word;
    109             second_ptr = second_word;
    110         }
    111         
    112         for (int i = 0; i < diff_step; i++)
    113             first_ptr = first_ptr.next;
    114         while (first_ptr != second_ptr){
    115             first_ptr = first_ptr.next;
    116             second_ptr = second_ptr.next;
    117         }
    118         
    119         System.out.println(first_ptr.address);
    120     }
    121 }
  • 相关阅读:
    [LeetCode]Interleaving String关于遍历和动态规划
    [LeetCode]Power
    [LeetCode]Two Sum
    [LeetCode]wildcard matching通配符实现之贪心法
    [LeetCode]wildcard matching通配符实现之动态规划
    [LeetCode]wildcard matching通配符实现之递归
    回文分割
    iOS开发之应用内检测手机锁屏,解锁状态
    iOS 拨打电话
    iOS 中文转拼音
  • 原文地址:https://www.cnblogs.com/EpisodeXI/p/4068684.html
Copyright © 2011-2022 走看看