https://leetcode.cn/problems/4ueAj6/
思路:找出列表中的最大值max和最小值min,分类讨论:
1、max==min 随便哪个位置插入都可以
2、max!=min
(1)inserVal<=min:找到第一个min(如果有重复)和它之前的节点,进行插入
(2)insertVal>=max:找到最后一个max(如果有重复)和它之后的节点,插入
(3)min<insertVal<max :遍历整个列表找到正确插入位置
(边界条件好烦···)
/**
* Definition for a Node.
* struct Node {
* int val;
* struct TreeNode *next;
* };
*/
struct Node* init(int insertVal){
struct Node* node=(struct Node*)malloc(sizeof(struct Node));
node->val=insertVal;
node->next=NULL;
return node;
}
//分成两非递减段列表处理,其中第二段列表的最大值一定<=第一段列表的最小值
struct Node* insert(struct Node* head, int insertVal) {
struct Node* insertNode=init(insertVal);
if(head==NULL) {
insertNode->next=insertNode;
return insertNode;
}
int min=head->val,max=head->val;
struct Node*p=head->next;
while(p!=head){
if(p->val>max) max=p->val;
else if(p->val<min) min=p->val;
else;
p=p->next;
}
if(max==min){
insertNode->next=head->next;
head->next=insertNode;
}else{
//q指向最后一个(如果有重复的话)最大值
//q指向两个数组的边界,第一个数组的末尾
struct Node*q=p;
while(p->val!=max) p=p->next;
while(p->val==max){
q=p;
p=p->next;
}
if(max<=insertVal){
insertNode->next=q->next;
q->next=insertNode;
}
//insertVal<max
else{
if(insertVal<=min){
insertNode->next=q->next;
q->next=insertNode;
}
//min<insertVal<max
else{
//q指向最后一个min
// while(p->val!=min) p=p->next;
// while(p->val==min){
// q=p;
// p=p->next;
// }
while(p->val<=insertVal){
q=p;
p=p->next;
}
insertNode->next=q->next;
q->next=insertNode;
}
}
}
return head;
}