Welcome to Subscribe On Youtube

Formatted question description: https://leetcode.ca/all/1019.html

1019. Next Greater Node In Linked List (Medium)

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.val such that j > i, node_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].

Companies:
Microsoft

Related Topics:
Linked List, Stack

Solution 1. Monostack

// OJ: https://leetcode.com/problems/next-greater-node-in-linked-list/
// Time: O(N)
// Space: O(N)
class Solution {
    ListNode *reverseList(ListNode *head) {
        ListNode h;
        while (head) {
            auto node = head;
            head = head->next;
            node->next = h.next;
            h.next = node;
        }
        return h.next;
    }
public:
    vector<int> nextLargerNodes(ListNode* head) {
        vector<int> ans;
        stack<int> s;
        head = reverseList(head);
        for (; head; head = head->next) {
            while (s.size() && s.top() <= head->val) s.pop();
            ans.push_back(s.size() ? s.top() : 0);
            s.push(head->val);
        }
        reverse(ans.begin(), ans.end());
        return ans;
    }
};

Solution 2. Monostack

// OJ: https://leetcode.com/problems/next-greater-node-in-linked-list/
// Time: O(N)
// Space: O(N)
class Solution {
public:
    vector<int> nextLargerNodes(ListNode* head) {
        vector<int> ans;
        stack<int> s;
        for (; head; head = head->next) ans.push_back(head->val);
        for (int i = 0; i < ans.size(); ++i) {
            while (s.size() && ans[s.top()] < ans[i]) {
                ans[s.top()] = ans[i];
                s.pop();
            }
            s.push(i);
        }
        for (; s.size(); s.pop()) ans[s.top()] = 0;
        return ans;
    }
};
  • /**
     * Definition for singly-linked list.
     * public class ListNode {
     *     int val;
     *     ListNode next;
     *     ListNode(int x) { val = x; }
     * }
     */
    class Solution {
        public int[] nextLargerNodes(ListNode head) {
            Stack<ListNode> nodesStack = new Stack<ListNode>();
            ListNode temp = head;
            while (temp != null) {
                nodesStack.push(temp);
                temp = temp.next;
            }
            int length = nodesStack.size();
            int[] nextLarger = new int[length];
            Stack<Integer> largestStack = new Stack<Integer>();
            for (int i = length - 1; i >= 0; i--) {
                ListNode node = nodesStack.pop();
                int value = node.val;
                while (!largestStack.isEmpty() && largestStack.peek() <= value)
                    largestStack.pop();
                if (!largestStack.isEmpty())
                    nextLarger[i] = largestStack.peek();
                largestStack.push(value);
            }
            return nextLarger;
        }
    }
    
    ############
    
    /**
     * Definition for singly-linked list.
     * public class ListNode {
     *     int val;
     *     ListNode next;
     *     ListNode() {}
     *     ListNode(int val) { this.val = val; }
     *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
     * }
     */
    class Solution {
        public int[] nextLargerNodes(ListNode head) {
            List<Integer> nums = new ArrayList<>();
            for (; head != null; head = head.next) {
                nums.add(head.val);
            }
            Deque<Integer> stk = new ArrayDeque<>();
            int n = nums.size();
            int[] ans = new int[n];
            for (int i = n - 1; i >= 0; --i) {
                while (!stk.isEmpty() && stk.peek() <= nums.get(i)) {
                    stk.pop();
                }
                if (!stk.isEmpty()) {
                    ans[i] = stk.peek();
                }
                stk.push(nums.get(i));
            }
            return ans;
        }
    }
    
  • // OJ: https://leetcode.com/problems/next-greater-node-in-linked-list/
    // Time: O(N)
    // Space: O(N)
    class Solution {
        ListNode *reverseList(ListNode *head) {
            ListNode h;
            while (head) {
                auto node = head;
                head = head->next;
                node->next = h.next;
                h.next = node;
            }
            return h.next;
        }
    public:
        vector<int> nextLargerNodes(ListNode* head) {
            vector<int> ans;
            stack<int> s;
            head = reverseList(head);
            for (; head; head = head->next) {
                while (s.size() && s.top() <= head->val) s.pop();
                ans.push_back(s.size() ? s.top() : 0);
                s.push(head->val);
            }
            reverse(ans.begin(), ans.end());
            return ans;
        }
    };
    
  • # Definition for singly-linked list.
    # class ListNode:
    #     def __init__(self, x):
    #         self.val = x
    #         self.next = None
    
    
    class Solution:
        def nextLargerNodes(self, head: ListNode) -> List[int]:
            nums = []
            while head:
                nums.append(head.val)
                head = head.next
            s = []
            larger = [0] * len(nums)
            for i, num in enumerate(nums):
                while s and nums[s[-1]] < num:
                    larger[s.pop()] = num
                s.append(i)
            return larger
    
    ############
    
    # Definition for singly-linked list.
    # class ListNode(object):
    #     def __init__(self, x):
    #         self.val = x
    #         self.next = None
    
    class Solution(object):
        def nextLargerNodes(self, head):
            """
            :type head: ListNode
            :rtype: List[int]
            """
            nums = []
            while head:
                nums.append(head.val)
                head = head.next
            stack = []
            res = [0] * len(nums)
            for i, n in enumerate(nums):
                while stack and nums[stack[-1]] < n:
                    res[stack.pop()] = n
                stack.append(i)
            return res
    
  • /**
     * Definition for singly-linked list.
     * type ListNode struct {
     *     Val int
     *     Next *ListNode
     * }
     */
    func nextLargerNodes(head *ListNode) []int {
    	nums := []int{}
    	for ; head != nil; head = head.Next {
    		nums = append(nums, head.Val)
    	}
    	stk := []int{}
    	n := len(nums)
    	ans := make([]int, n)
    	for i := n - 1; i >= 0; i-- {
    		for len(stk) > 0 && stk[len(stk)-1] <= nums[i] {
    			stk = stk[:len(stk)-1]
    		}
    		if len(stk) > 0 {
    			ans[i] = stk[len(stk)-1]
    		}
    		stk = append(stk, nums[i])
    	}
    	return ans
    }
    
  • /**
     * Definition for singly-linked list.
     * class ListNode {
     *     val: number
     *     next: ListNode | null
     *     constructor(val?: number, next?: ListNode | null) {
     *         this.val = (val===undefined ? 0 : val)
     *         this.next = (next===undefined ? null : next)
     *     }
     * }
     */
    
    interface Item {
        index: number;
        val: number;
    }
    
    function nextLargerNodes(head: ListNode | null): number[] {
        const res: number[] = [];
        const stack: Item[] = [];
        let cur = head;
        for (let i = 0; cur != null; i++) {
            res.push(0);
            const { val, next } = cur;
            while (stack.length !== 0 && stack[stack.length - 1].val < val) {
                res[stack.pop().index] = val;
            }
            stack.push({
                val,
                index: i,
            });
            cur = next;
        }
        return res;
    }
    
    
  • /**
     * Definition for singly-linked list.
     * function ListNode(val) {
     *     this.val = val;
     *     this.next = null;
     * }
     */
    /**
     * @param {ListNode} head
     * @return {number[]}
     */
    var nextLargerNodes = function (head) {
        let nums = [];
        while (head != null) {
            nums.push(head.val);
            head = head.next;
        }
        const n = nums.length;
        let larger = new Array(n).fill(0);
        let stack = [];
        for (let i = 0; i < n; i++) {
            let num = nums[i];
            while (stack.length > 0 && nums[stack[stack.length - 1]] < num) {
                larger[stack.pop()] = num;
            }
            stack.push(i);
        }
        return larger;
    };
    
    
  • // Definition for singly-linked list.
    // #[derive(PartialEq, Eq, Clone, Debug)]
    // pub struct ListNode {
    //   pub val: i32,
    //   pub next: Option<Box<ListNode>>
    // }
    //
    // impl ListNode {
    //   #[inline]
    //   fn new(val: i32) -> Self {
    //     ListNode {
    //       next: None,
    //       val
    //     }
    //   }
    // }
    struct Item {
        index: usize,
        val: i32,
    }
    
    impl Solution {
        pub fn next_larger_nodes(head: Option<Box<ListNode>>) -> Vec<i32> {
            let mut res = Vec::new();
            let mut stack: Vec<Item> = Vec::new();
            let mut cur = &head;
            for i in 0..usize::MAX {
                if cur.is_none() {
                    break;
                }
                res.push(0);
                let node = cur.as_ref().unwrap();
                while !stack.is_empty() && stack.last().unwrap().val < node.val {
                    res[stack.pop().unwrap().index] = node.val;
                }
                stack.push(Item {
                    index: i,
                    val: node.val,
                });
                cur = &node.next;
            }
            res
        }
    }
    
    

All Problems

All Solutions