题目地址:
https://leetcode.com/problems/insert-into-a-sorted-circular-linked-list/
给定一个有序的循环单链表,再给定一个数,要求将这个数插入单链表使得链表仍然有序。返回插入的那个新节点。
需要分成三个情况讨论:
1、原链表为空:此时直接new出一个新节点返回即可。需要注意,new完这个节点后,还需要将其指向自己,否则不能成为一个循环链表;
2、原链表存在两个相邻节点
a
,
b
a,b
a,b使得
x
∈
[
a
,
b
]
x\in [a,b]
x∈[a,b],此时将
x
x
x插在
a
a
a后面即可;
3、原链表不存在2中的两个节点,此时说明
x
x
x要么比所有数都小,要么比所有数都大,如果存在两个相邻节点
a
,
b
a,b
a,b使得
a
>
b
a>b
a>b,则将
x
x
x插在后面即可;如果不存在,说明链表所有节点数字都相等,随便插在哪里都可以。
代码如下:
/*
// 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 x) {
if (!head) {
auto res = new Node(x);
res->next = res;
return res;
}
auto add = [&](Node* cur, int x) {
auto n = new Node(x);
n->next = cur->next;
cur->next = n;
};
auto cur = head;
do {
if (cur->val <= x && x <= cur->next->val) {
add(cur, x);
return head;
}
cur = cur->next;
} while (cur != head);
cur = head;
do {
if (cur->val > cur->next->val) {
add(cur, x);
return head;
}
cur = cur->next;
} while (cur != head);
add(cur, x);
return head;
}
};
时间复杂度 O ( n ) O(n) O(n),空间 O ( 1 ) O(1) O(1)。