zoukankan      html  css  js  c++  java
  • LeetCode 1019. Next Greater Node In Linked List

    原题链接在这里:https://leetcode.com/problems/next-greater-node-in-linked-list/

    题目:

    We are given a linked list with head as the first node.  Let's number the nodes in the list: node_1, node_2, node_3, ... etc.

    Each node may have a next larger value: for node_inext_larger(node_i) is the node_j.valsuch that j > inode_j.val > node_i.val, and j is the smallest possible choice.  If such a j does not exist, the next larger value is 0.

    Return an array of integers answer, where answer[i] = next_larger(node_{i+1}).

    Note that in the example inputs (not outputs) below, arrays such as [2,1,5] represent the serialization of a linked list with a head node value of 2, second node value of 1, and third node value of 5.

    Example 1:

    Input: [2,1,5]
    Output: [5,5,0]
    

    Example 2:

    Input: [2,7,4,3,5]
    Output: [7,0,5,5,0]
    

    Example 3:

    Input: [1,7,5,1,9,2,5,1]
    Output: [7,9,9,9,0,5,0,0]

    Note:

    1. 1 <= node.val <= 10^9 for each node in the linked list.
    2. The given list has length in the range [0, 10000].

    题解:

    类似Next Greater Element INext Greater Element II.

    利用stack记录从后向前渐渐变小的栈.

    reverse list后就可以从后向前iterate list. 遇到一个点,在stack中一直pop到比自己大的点就是next greater element. 如果stack空了也没找到,就是没有.

    记下结果后再把当前点push到stack中.

    Time Complexity: O(n).

    Space: O(n).

    AC Java:

     1 /**
     2  * Definition for singly-linked list.
     3  * public class ListNode {
     4  *     int val;
     5  *     ListNode next;
     6  *     ListNode(int x) { val = x; }
     7  * }
     8  */
     9 class Solution {
    10     public int[] nextLargerNodes(ListNode head) {
    11         if(head == null){
    12             return new int[0];
    13         }
    14         
    15         if(head.next == null){
    16             return new int[]{0};
    17         }
    18         
    19         int len = getLength(head);
    20         int [] res = new int[len];
    21         head = reverse(head);
    22         Stack<Integer> stk = new Stack<Integer>();
    23         
    24         for(int i = 0; i<len; i++){
    25             while(!stk.isEmpty() && head.val>=stk.peek()){
    26                 stk.pop();
    27             }
    28             
    29             res[len-i-1] = stk.isEmpty() ? 0 : stk.peek();
    30             stk.push(head.val);
    31             head = head.next;
    32         }
    33         
    34         return res;
    35     }
    36     
    37     private ListNode reverse(ListNode head){
    38         if(head == null || head.next == null){
    39             return head;
    40         }
    41         
    42         ListNode tail = head;
    43         ListNode cur = head;
    44         ListNode pre;
    45         ListNode temp;
    46         while(tail.next != null){
    47             pre = cur;
    48             cur = tail.next;
    49             temp = cur.next;
    50             cur.next = pre;
    51             tail.next = temp;
    52         }
    53         
    54         return cur;
    55     }
    56     
    57     private int getLength(ListNode head){
    58         int res = 0;
    59         while(head != null){
    60             head = head.next;
    61             res++;
    62         }
    63         
    64         return res;
    65     }
    66 }
  • 相关阅读:
    Linux 3.2中回写机制的变革
    Linux字符设备与块设备的区别与比较
    分布式文件系统:原理、问题与方法
    为什么说B+-tree比B 树更适合实际应用中操作系统的文件索引和数据库索引?
    Linux IO barrier
    磁盘IO:缓存IO与直接IO
    【珍藏】高性能IO模型浅析
    souretree+上面提交代码和gerrit上面出现Cannot+merge的时候的解决方法
    vscode快速生成自定义HTML模板
    在jq里面设置样式的高度height、设置隐藏和显示的小功能
  • 原文地址:https://www.cnblogs.com/Dylan-Java-NYC/p/10967068.html
Copyright © 2011-2022 走看看