题目
给定循环单调非递减列表中的一个点,写一个函数向这个列表中插入一个新元素 insertVal ,使这个列表仍然是循环升序的。
给定的可以是这个列表中任意一个顶点的指针,并不一定是这个列表中最小元素的指针。
如果有多个满足条件的插入位置,可以选择任意一个位置插入新的值,插入后整个列表仍然保持有序。
如果列表为空(给定的节点是 null),需要创建一个循环有序列表并返回这个节点。否则。请返回原先给定的节点。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/4ueAj6
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
示例
思路
遍历整个链表,找到新元素 insertVal的插入点
插入点要求前一个节点小于insertVal,后一个节点大于insertVal
其中有一个特殊情况,就是插入点位于循环升序链表的升序首节点之前,尾结点之后
可以判断前后节点大小来确定是否为特殊情况
代码
/**
* Definition for a Node.
* struct Node {
* int val;
* struct TreeNode *next;
* };
*/
/*
*insert:向循环升序链表中插入一个新元素
struct Node* head:循环链表
int insertVal:新元素
返回值:新的循环链表
*/
struct Node* insert(struct Node* head, int insertVal) {
struct Node * node = malloc(sizeof(struct Node));
node->val = insertVal;
if(!head)//head不存在
{
node->next = node;
return node;
}
if(head == head->next)//head为一一个
{
node->next = head;
head->next = node;
return head;
}
struct Node * k = head;
struct Node * l = head->next;
while(head != l)
{
if(k->val <= insertVal && l->val >= insertVal)//不是特殊情况,满足插入点基本要求
{
break;
}
if(k->val > l->val)//判断是不是位于升序节点上
{
if(k->val < insertVal || l->val > insertVal)//是的,在判断是不是满足插入点要求
{
break;
}
}
k = k->next;
l = l->next;
}
k->next = node;//插入新元素,并且保证链表还是循环的
node->next = l;
return head;
}
时间空间复杂度