给定循环升序列表中的一个点,写一个函数向这个列表中插入一个新元素,使这个列表仍然是循环升序的。 给定的可以是这个列表中任意一个顶点的指针,并不一定是这个列表中最小元素的指针。
如果有多个满足条件的插入位置,你可以选择任意一个位置插入新的值,插入后整个列表仍然保持有序。
如果列表为空(给定的节点是 null),你需要创建一个循环有序列表并返回这个点。 否则。请返回原先给定的节点。
下面的例子可以帮你更好的理解这个问题:
在上图中,有一个包含三个元素的循环有序列表,你获得值为 3 的节点的指针,我们需要向表中插入元素 2。
新插入的节点应该在 1 和 3 之间,插入之后,整个列表如上图所示,最后返回节点 3。
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/insert-into-a-sorted-circular-linked-list 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
下一个节点 >= insert
&& 当前节点 <= insert
的节点/*
// Definition for a Node.
class Node {
public:
int val;
Node* next;
Node() {}
Node(int _val) {
val = _val;
next = NULL;
}
Node(int _val, Node* _next) {
val = _val;
next = _next;
}
};
*/
class Solution {
public:
Node* insert(Node* head, int insertVal) {
if(!head)
{
head = new Node(insertVal);
head->next = head;
return head;
}
Node *newnode = new Node(insertVal);
Node* biggest = head, *cur = head;
int biggestVal = head->val;//最大值
while(true)
{
if(cur->val <= insertVal && cur->next->val >= insertVal)
{ //找到了
newnode->next = cur->next;
cur->next = newnode;
return head;
}
if(cur->val >= biggestVal)
{ //记录最大值节点
biggestVal = cur->val;
biggest = cur;
}
if(cur->next == head)//转了一圈了
break;
cur = cur->next;
}
newnode->next = biggest->next;//插入的是最大值或最小值
biggest->next = newnode;
return head;
}
};
20 ms 8.3 MB
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有