リンクされたリストに戻る次へ大要素I次グレーター要素IIではLeetCode 1019次グレーターノード

ここでのオリジナルタイトルリンク: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. 1 <= node.val <= 10^9 リンクリスト内の各ノードについて。
  2. 与えられたリストは、範囲の長さを持っています  [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 }

 

おすすめ

転載: www.cnblogs.com/Dylan-Java-NYC/p/10967068.html