Skip to content

Latest commit

 

History

History
144 lines (125 loc) · 3.86 KB

1019-Next Greater Node In Linked List.md

File metadata and controls

144 lines (125 loc) · 3.86 KB

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_i, next_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].

Solution

O(n^2) Time, O(1) Space:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     public var val: Int
 *     public var next: ListNode?
 *     public init(_ val: Int) {
 *         self.val = val
 *         self.next = nil
 *     }
 * }
 */
class Solution {
    func nextLargerNodes(_ head: ListNode?) -> [Int] {
        var nums = serialize(head)

        // For each element in nums, identify the next greater element
        for i in 0..<nums.count {

            // The last element will not have a next greater element
            if i == nums.count-1 {
                nums[i] = 0
                break
            }

            // Traverse through elements after element at i
            for j in i+1..<nums.count {

                // If element is found, assign its value to nums[i]
                if nums[j] > nums[i] {
                    nums[i] = nums[j]
                    break
                }

                // No element greater than element at i found
                if j == nums.count-1 {
                    nums[i] = 0
                }
            }
        }
        return nums
    }

    func serialize(_ head: ListNode?) -> [Int] {
        var head = head, result : [Int] = []
        while let curr = head {
            result.append(curr.val)
            head = curr.next
        }
        return result
    }
}

O(n) Time, O(n) Space:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     public var val: Int
 *     public var next: ListNode?
 *     public init(_ val: Int) {
 *         self.val = val
 *         self.next = nil
 *     }
 * }
 */
class Solution {
    func nextLargerNodes(_ head: ListNode?) -> [Int] {
        var nums = serialize(head)

        // Use a stack to track the next greater element as nums
        // is traversed from the end
        var stack : [Int] = []
        for i in stride(from: nums.count-1, through: 0, by: -1) {
            let num = nums[i]

            // Keep popping the stack until element at the top of the stack
            // is greater than num
            while let last = stack.last, last <= num {
                _ = stack.removeLast()
            }

            // If stack is empty, there are no elements greater than num
            // after num's index (assign 0), otherwise the top element is
            // the first greater element.
            if let last = stack.last {
                nums[i] = last
            } else {
                nums[i] = 0
            }

            // Push element onto the stack
            stack.append(num)
        }
        return nums
    }

    func serialize(_ head: ListNode?) -> [Int] {
        var head = head, result : [Int] = []
        while let curr = head {
            result.append(curr.val)
            head = curr.next
        }
        return result
    }
}