leetCode 1019. 链表中的下一个更大节点

1019. 链表中的下一个更大节点

我的题解

原题描述

给定一个长度为 n 的链表 head对于列表中的每个节点,查找下一个 更大节点 的值。也就是说,对于每个节点,找到它旁边的第一个节点的值,这个节点的值 严格大于 它的值。

返回一个整数数组 answer ,其中 answer[i] 是第 i 个节点( 从1开始 )的下一个更大的节点的值。如果第 i 个节点没有下一个更大的节点,设置 answer[i] = 0 。

示例 1:

 

输入:head = [2,1,5]
输出:[5,5,0]

示例 2:

 

输入:head = [2,7,4,3,5]
输出:[7,0,5,5,0]

思路

  1. 将链表转换为等长的数组。
  2. 创建单调栈,维护栈内的元素保持非递增
  3. 当元素比栈顶的元素大时,说明当前元素就是栈顶元素的下一个更大节点

解题方法

1.创建和链表等长的链表

//计算链表长度
ListNode l =  head;
int length = 0;
 while (l!=null){
    l=l.next;
    length++;
}
//创建长度相同长度的数组
int[] ints = new int[length];

2.遍历链表,将链表的值存储到数组中,当当前元素比栈顶元素大时,说明当前元素就是栈顶元素的下一个更大节点。

// 保证栈中的数据非递增
Stack<Integer> stack =new Stack<>();
ListNode node =  head;
//遍历链表
while (node!=null){
     //把当前元素放入链表
    ints[index]=node.val;
    // 遇到比栈顶元素比当前元素小,则弹出
    while (!stack.isEmpty()&&ints[stack.peek()]<ints[index]){
        //弹出元素 说明当前元素是弹出元素的下一个更大节点
         int c=stack.pop();
        ints[c]=ints[index];
    }
    stack.add(index);
    //处理下一个元素
    node = node.next;
    index++;
}

3.遍历链表结束,栈不为空,栈内的元素都是右面没有比它大的元素 直接赋值为0

while (!stack.isEmpty()){
    int c=stack.pop();
    ints[c]=0;
}

复杂度

  • 时间复杂度: O(n)

  • 空间复杂度: O(n)

Code

class Solution {
 public static int[] nextLargerNodes(ListNode head) {
        //计算链表长度
        ListNode l =  head;
        int length = 0;
        while (l!=null){
            l=l.next;
            length++;
        }
        //创建长度相同长度的数组
        int[] ints = new int[length];
        int index = 0;
        // 保证栈中的数据非递增
        Stack<Integer> stack =new Stack<>();
        ListNode node =  head;
        //遍历链表
        while (node!=null){
             //把当前元素放入链表
            ints[index]=node.val;
             // 遇到比栈顶元素比当前元素小,则弹出
            while (!stack.isEmpty()&&ints[stack.peek()]<ints[index]){
                 //弹出元素 说明当前元素是弹出元素的下一个更大节点
                int c=stack.pop();
                ints[c]=ints[index];
            }
            stack.add(index);
            //处理下一个元素
            node = node.next;
            index++;
        }
        //遍历结束 栈不为空,栈内的元素都是右面没有比它大的元素 直接赋值为0
        while (!stack.isEmpty()){
            int c=stack.pop();
            ints[c]=0;
        }
    return  ints;
    }
}

执行效果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值