• 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 }
  • 相关阅读:
    Chapter 4.SQL编程
    Chapter 4. 联合结果集union、插入整个表
    Chapter 4. 聚合函数、字符串函数、类型转换函数、时间日期函数
    Chapter 3. 数据检索(查询)---select、top...order by、distinct、where条件查询、分组查询、模糊查询、null处理
    练习. SQL--学生、教师、分数
    练习. SQL--选修课程练习
    Chapter 3. 数据库约束(SQL语句实现)
    Chapter 3. 数据库约束(设计器操作)
    1月11 数据索引及函数
    1月11日 数据库及表的操作
  • 原文地址:https://www.cnblogs.com/Dylan-Java-NYC/p/10967068.html
Copyright © 2020-2023  润新知