题目描述:
给出一个单向链表。链表中的节点分别编号为: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 。示例 2: 输入:[2,7,4,3,5] 输出:[7,0,5,5,0]
题目解析
第一遍读的时候着实没读懂,再看一下示例,噢!是这个意思啊:
比如链表2->7->4->3->5 其中2的下一个更大节点就是7,7没有下一个更大节点就是0,4和3的下一个更大节点就是5…
像这样下去,其实每比较一个结点就要遍历一下后面的结点。
解题思路
代码:
#include<iostream>
#include<vector>
using namespace std;
struct ListNode{
int val;
ListNode *next;
};
ListNode *createByTail(){
ListNode *head;
ListNode *p;
ListNode *tail;
int len;
int n=0;
int num;
cin>>len;
head=NULL;
while(n<len && cin>>num){
p=new ListNode;
p->val=num;
p->next=NULL;
n=n+1;
if(n==1){
head=p;
}
else{
tail->next=p;
}
tail=p;
}
return head;
}
void displayLink(ListNode *head){
ListNode *p=head;
cout<<"head-->";
while(p!=NULL){
cout<<p->val<<"-->";
p=p->next;
}
cout<<"tail\n";
}
class Solution{
public:
vector<int> nextLargeNodes(ListNode *head){
vector<int> vec;
ListNode *p=head;
while(p)
{
ListNode *t=p;
int larg=t->val;
int maxm=larg;
while(t){
if(t->val>maxm){
maxm=t->val;
break;
}
t=t->next;
}
if(larg<maxm)
vec.push_back(maxm);
else
vec.push_back(0);
p=p->next;
}
return vec;
}
};
int main(){
ListNode *head=createByTail();
vector<int> res=Solution().nextLargeNodes(head);
for(int i=0;i<res.size();i++){
if(i>0){
cout<<" ";
}
cout<<res[i];
}
cout<<endl;
return 0;
}