1019. 連結串列中的下一個更大節點
連結串列演算法題(程式設計師面試寶典)
解題思路主要來源於leetcode官方與《程式設計師面試寶典》。
1019. 連結串列中的下一個更大節點
給出一個以頭節點 head 作為第一個節點的連結串列。連結串列中的節點分別編號為:node_1, node_2, node_3, … 。
每個節點都可能有下一個更大值(next larger value):對於 node_i,如果其 next_larger(node_i) 是 node_j.val,那麼就有 j > i 且 node_j.val > node_i.val,而 j 是可能的選項中最小的那個。如果不存在這樣的 j,那麼下一個更大值為 0 。
返回整數答案陣列 answer,其中 answer[i] = next_larger(node_{i+1}) 。
注意:在下面的示例中,諸如 [2,1,5] 這樣的輸入(不是輸出)是連結串列的序列化表示,其頭節點的值為 2,第二個節點值為 1,第三個節點值為 5 。
示例 1:
輸入:[2,1,5]
輸出:[5,5,0]
示例 2:
輸入:[2,7,4,3,5]
輸出:[7,0,5,5,0]
示例 3:
輸入:[1,7,5,1,9,2,5,1]
輸出:[7,9,9,9,0,5,0,0]
提示:
對於連結串列中的每個節點,1 <= node.val <= 10^9
給定列表的長度在 [0, 10000] 範圍內
解題方法
解題思路1
雙迴圈遍歷,找curNode後第一個比curNode.val大的節點node,找到的話,將int[i] = node.val,未找到的話 int[i] = 0。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public int[] nextLargerNodes(ListNode head) {
//儲存結果
ArrayList<Integer> result = new ArrayList<Integer>();
//雙迴圈遍歷,將curNode與其後每一個節點
ListNode curNode = head;
while(curNode.next!=null){
ListNode node = curNode.next;
//flag: 標記是否找到curNode後第一個比curNode.val大的節點,true:yes false:no
boolean flag = false;
while(node!=null){
if(node.val>curNode.val){
//找到curNode後第一個最大
flag = true;
break;
}
node = node.next;
}
if(flag == true){
//找到curNode後第一個比curNode.val大的節點
result.add(node.val);
}else{
//未找到curNode後比curNode.val大的節點
result.add(0);
}
curNode = curNode.next;
}
result.add(0);
int[] resultInt = new int[result.size()];
for(int i=0;i<result.size();i++){
resultInt[i] = result.get(i);
}
return resultInt;
}
}
解題思路2
單調棧的思想。思路來源:https://labuladong.github.io/ebook/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E7%B3%BB%E5%88%97/%E5%8D%95%E8%B0%83%E6%A0%88.html
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public int[] nextLargerNodes(ListNode head) {
//儲存連結串列值
ArrayList<Integer> data = new ArrayList<Integer>();
while(head!=null){
data.add(head.val);
head = head.next;
}
//儲存結果
int[] result = new int[data.size()];
//單調棧的思想,棧用來儲存節點值
Stack<Integer> s = new Stack<Integer>();
//data中的節點數
int num = data.size();
for(int i=num-1;i>=0;i--){
while(!s.empty()&&s.peek()<=data.get(i)){
//矮個子先出棧
s.pop();
}
//棧不為空說明有高個,即為當前result[i]的值,否則為無效值
result[i] = !s.empty()?s.peek():0;
//將當前data[i]值加入棧中
s.add(data.get(i));
}
return result;
}
}
相關文章
- [連結串列]leetcode1019-連結串列中的下一個更大節點LeetCode
- 【連結串列問題】刪除單連結串列的中間節點
- K個節點翻轉連結串列
- 2024/11/27 【連結串列】LeetCode 24 兩兩交換連結串列中的節點 & LeetCode 19 刪除連結串列的倒數第N個節點LeetCode
- 兩個連結串列的第一個公共節點
- 連結串列中的節點每k個一組翻轉
- leetcode----刪除連結串列中的節點LeetCode
- 【連結串列問題】打卡3:刪除單連結串列的中間節點
- 【連結串列問題】打卡2:刪除單連結串列的第 K個節點
- **24. 兩兩交換連結串列中的節點****19.刪除連結串列的倒數第N個節點****面試題 02.07. 連結串列相交****142.環形連結串列II**面試題
- 定義一個函式,輸入一個連結串列的頭節點,反轉該連結串列並輸出反轉後連結串列的頭節點函式
- Day4(連結串列)|24. 兩兩交換連結串列中的節點 & 19.刪除連結串列的倒數第N個節點 & 面試題 02.07. 連結串列相交 &142.環形連結串列II面試題
- 特定深度節點連結串列
- Day 4 | 24. 兩兩交換連結串列中的節點 、 19.刪除連結串列的倒數第N個節點 、面試題 02.07. 連結串列相交 、142.環形連結串列II面試題
- 第四天:● 24. 兩兩交換連結串列中的節點 ● 19.刪除連結串列的倒數第N個節點 ● 面試題 02.07. 連結串列相交 ● 142.環形連結串列II面試題
- leetcode 24 兩兩交換連結串列中的節點LeetCode
- Redis筆記 — 連結串列和連結串列節點的API函式(三)Redis筆記API函式
- 166. 連結串列倒數第n個節點
- 0011 刪除連結串列的倒數第N個節點
- 牛客(刪除連結串列中重複節點)
- 【LeetCode連結串列#9】圖解:兩兩交換連結串列節點LeetCode圖解
- 連結串列中環的入口結點
- 雙向連結串列 尾節點插入
- 【劍指offer】【3】輸入一個連結串列,從尾到頭列印連結串列每個節點的值。
- leetcode 24.兩兩交換連結串列中的節點LeetCode
- JZ76 刪除連結串列中重複的節點
- LeetCode 24. 兩兩交換連結串列中的節點LeetCode
- 24. 兩兩交換連結串列中的節點 (中等)
- 程式碼隨想錄第4天 | 24. 兩兩交換連結串列中的節點、19.刪除連結串列的倒數第N個節點、面試題 02.07. 連結串列相交、142.環形連結串列II面試題
- 【LeetCode】【連結串列】劍指 Offer 52. 兩個連結串列的第一個公共節點 思路解析和程式碼LeetCode
- 程式碼隨想錄演算法訓練營第四天 | 連結串列 24.兩兩交換連結串列中的節點 19.刪除連結串列的倒數第N個節點 142.環形連結串列II演算法
- 劍指Offer-38-兩個連結串列的第一個公共節點
- LeetCode每日一題:刪除連結串列中的節點(No.237)LeetCode每日一題
- 劍指offer-----刪除連結串列中的重複節點
- 876. 連結串列的中間結點
- 兩個連結串列的第一個公共結點
- 單連結串列-相鄰節點交還
- 【連結串列問題】打卡8:複製含有隨機指標節點的連結串列隨機指標