ここでのオリジナルタイトルリンク:https://leetcode.com/problems/next-greater-node-in-linked-list/
トピック:
我々はにリンクされたリストを与えられている head
最初のノードとして。のは、リスト内のノードに番号をしてみましょう: node_1, node_2, node_3, ...
など
各ノードが有していてもよい 次の大きな 値:ため node_i
、 next_larger(node_i)
である node_j.val
ように j > i
、 node_j.val > node_i.val
および j
最小の可能な選択肢です。そのようなaが場合 j
存在しない、次のより大きな値です 0
。
整数の配列を返します answer
。ここで answer[i] = next_larger(node_{i+1})
。
例えば、入力(出力しない)で以下のような配列のことに注意してください [2,1,5]
2のヘッドノードの値、1の第2のノードの値、及び5の第3のノード値にリンクされたリストのシリアル化を表します。
例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]
。
ソリューション:
类似次グレーター要素I、 次グレーター要素II。
使用記録スタックは、徐々にフロントスタックから減少しています。
反復リストの後に後ろから前へと逆のリスト。遭遇したスタックをポップするためのポイントは、彼のポイントは次の大きな要素であるよりも、大きなされています。スタックが空である場合には見つけられませんでした、そうではありません。
そして、スタックにプッシュして、現在のポイントの結果を書き留めます。
時間計算:O(n)を。
スペース:O(n)を。
ACのJava:
1 / ** 2 重リンクリストのための*の定義。 3 *パブリッククラスListNode { 4 * int型のval; 5 * ListNode次。 6 * ListNode(INT X){ヴァル= X。} 7 *} 8 * / 9 クラスソリューション{ 10 公共 のint [] nextLargerNodes(ListNodeヘッド){ 11 であれば(ヘッド== NULL ){ 12 リターン 新しい INT [0 ]。 13 } 14 15 であれば(head.next == NULL ){ 16 戻り 新しい INT [] {0 }。 17 } 18 19 INT LEN = のgetLength(ヘッド) 20 INT [] RES = 新しい INT [LEN]。 21 ヘッド= 逆(ヘッド) 22 スタック<整数> STK = 新しいスタック<整数> (); 23 24 のために(int型 i = 0; iは<LEN; iは++ ){ 25 ながら(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.next。 32 } 33の 34 戻りRES。 35 } 36 37 プライベートListNode逆(ListNodeヘッド){ 38 であれば(ヘッド== NULL || head.next == NULL ){ 39 リターンヘッド。 40 } 41 42 ListNodeテール= ヘッド。 43 ListNode CUR =頭; 44 ListNodeプレ。 45 ListNodeの一時。 46 ながら(!tail.next = NULL ){ 47 プリ= CUR。 48 CUR = tail.next。 49 TEMP = cur.next。 50 cur.next = プレ。 51 tail.next = TEMP。 52 } 53 54 戻りCUR。 55 } 56 57 プライベート int型のgetLength(ListNodeヘッド){ 58 、INTRES = 0 ; 59 一方(ヘッド!= NULL ){ 60 ヘッド= head.next。 61の RES ++ 。 62 } 63の 64 戻りRES。 65 } 66 }