Skip to content

Commit 670cc25

Browse files
committed
feat: add solutions to lc/lcof2 problems
lc No.0708 & lcof2 No.029.Insert into a Sorted Circular Linked List
1 parent 337e117 commit 670cc25

File tree

11 files changed

+262
-232
lines changed

11 files changed

+262
-232
lines changed

lcof2/剑指 Offer II 029. 排序的循环链表/README.md

Lines changed: 42 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -174,44 +174,54 @@ public:
174174
class Solution {
175175
public:
176176
Node* insert(Node* head, int insertVal) {
177-
Node* insert = new Node(insertVal);
178-
if (head == nullptr) {
179-
head = insert;
180-
head->next = head;
181-
} else if (head->next == nullptr) {
182-
head->next = insert;
183-
insert->next = head;
184-
} else {
185-
insertCore(head, insert);
177+
Node* node = new Node(insertVal);
178+
if (!head)
179+
{
180+
node->next = node;
181+
return node;
186182
}
187-
183+
Node *prev = head, *curr = head->next;
184+
while (curr != head)
185+
{
186+
if ((prev->val <= insertVal && insertVal <= curr->val) || (prev->val > curr->val && (insertVal >= prev->val || insertVal <= curr->val))) break;
187+
prev = curr;
188+
curr = curr->next;
189+
}
190+
prev->next = node;
191+
node->next = curr;
188192
return head;
189193
}
194+
};
195+
```
190196
191-
void insertCore(Node* head, Node* insert) {
192-
Node* cur = head;
193-
Node* maxNode = head;
194-
Node* next = head->next;
195-
196-
while (!(cur->val <= insert->val && insert->val <= next->val) && next != head) {
197-
cur = cur->next;
198-
next = next->next;
199-
200-
if (cur->val >= maxNode->val)
201-
maxNode = cur;
202-
}
203-
204-
if (cur->val <= insert->val && insert->val <= next->val) {
205-
insert->next = next;
206-
cur->next = insert;
207-
} else {
208-
insert->next = maxNode->next;
209-
maxNode->next = insert;
197+
### **Go**
210198
211-
}
199+
```go
200+
/**
201+
* Definition for a Node.
202+
* type Node struct {
203+
* Val int
204+
* Next *Node
205+
* }
206+
*/
212207
213-
}
214-
};
208+
func insert(head *Node, x int) *Node {
209+
node := &Node{Val: x}
210+
if head == nil {
211+
node.Next = node
212+
return node
213+
}
214+
prev, curr := head, head.Next
215+
for curr != head {
216+
if (prev.Val <= x && x <= curr.Val) || (prev.Val > curr.Val && (x >= prev.Val || x <= curr.Val)) {
217+
break
218+
}
219+
prev, curr = curr, curr.Next
220+
}
221+
prev.Next = node
222+
node.Next = curr
223+
return head
224+
}
215225
```
216226

217227
### **TypeScript**

lcof2/剑指 Offer II 029. 排序的循环链表/Solution.cpp

Lines changed: 14 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -22,41 +22,21 @@ class Node {
2222
class Solution {
2323
public:
2424
Node* insert(Node* head, int insertVal) {
25-
Node* insert = new Node(insertVal);
26-
if (head == nullptr) {
27-
head = insert;
28-
head->next = head;
29-
} else if (head->next == nullptr) {
30-
head->next = insert;
31-
insert->next = head;
32-
} else {
33-
insertCore(head, insert);
25+
Node* node = new Node(insertVal);
26+
if (!head)
27+
{
28+
node->next = node;
29+
return node;
3430
}
35-
36-
return head;
37-
}
38-
39-
void insertCore(Node* head, Node* insert) {
40-
Node* cur = head;
41-
Node* maxNode = head;
42-
Node* next = head->next;
43-
44-
while (!(cur->val <= insert->val && insert->val <= next->val) && next != head) {
45-
cur = cur->next;
46-
next = next->next;
47-
48-
if (cur->val >= maxNode->val)
49-
maxNode = cur;
31+
Node *prev = head, *curr = head->next;
32+
while (curr != head)
33+
{
34+
if ((prev->val <= insertVal && insertVal <= curr->val) || (prev->val > curr->val && (insertVal >= prev->val || insertVal <= curr->val))) break;
35+
prev = curr;
36+
curr = curr->next;
5037
}
51-
52-
if (cur->val <= insert->val && insert->val <= next->val) {
53-
insert->next = next;
54-
cur->next = insert;
55-
} else {
56-
insert->next = maxNode->next;
57-
maxNode->next = insert;
58-
59-
}
60-
38+
prev->next = node;
39+
node->next = curr;
40+
return head;
6141
}
6242
};
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
/**
2+
* Definition for a Node.
3+
* type Node struct {
4+
* Val int
5+
* Next *Node
6+
* }
7+
*/
8+
9+
func insert(head *Node, x int) *Node {
10+
node := &Node{Val: x}
11+
if head == nil {
12+
node.Next = node
13+
return node
14+
}
15+
prev, curr := head, head.Next
16+
for curr != head {
17+
if (prev.Val <= x && x <= curr.Val) || (prev.Val > curr.Val && (x >= prev.Val || x <= curr.Val)) {
18+
break
19+
}
20+
prev, curr = curr, curr.Next
21+
}
22+
prev.Next = node
23+
node.Next = curr
24+
return head
25+
}

solution/0700-0799/0708.Insert into a Sorted Circular Linked List/README.md

Lines changed: 60 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -70,21 +70,20 @@ class Node:
7070
self.next = next
7171
"""
7272

73+
7374
class Solution:
74-
def insert(self, head: 'Node', insertVal: int) -> 'Node':
75-
node = Node(val=insertVal)
75+
def insert(self, head: 'Optional[Node]', insertVal: int) -> 'Node':
76+
node = Node(insertVal)
7677
if head is None:
7778
node.next = node
7879
return node
79-
pre, cur = head, head.next
80-
while 1:
81-
if pre.val <= insertVal <= cur.val or (pre.val > cur.val and (insertVal >= pre.val or insertVal <= cur.val)):
82-
break
83-
pre, cur = cur, cur.next
84-
if pre == head:
80+
prev, curr = head, head.next
81+
while curr != head:
82+
if prev.val <= insertVal <= curr.val or (prev.val > curr.val and (insertVal >= prev.val or insertVal <= curr.val)):
8583
break
86-
pre.next = node
87-
node.next = cur
84+
prev, curr = curr, curr.next
85+
prev.next = node
86+
node.next = curr
8887
return head
8988
```
9089

@@ -119,19 +118,16 @@ class Solution {
119118
node.next = node;
120119
return node;
121120
}
122-
Node pre = head, cur = head.next;
123-
while (true) {
124-
if ((pre.val <= insertVal && insertVal <= cur.val) || (pre.val > cur.val && (insertVal >= pre.val || cur.val >= insertVal))) {
125-
break;
126-
}
127-
pre = cur;
128-
cur = cur.next;
129-
if (pre == head) {
121+
Node prev = head, curr = head.next;
122+
while (curr != head) {
123+
if ((prev.val <= insertVal && insertVal <= curr.val) || (prev.val > curr.val && (insertVal >= prev.val || insertVal <= curr.val))) {
130124
break;
131125
}
126+
prev = curr;
127+
curr = curr.next;
132128
}
133-
pre.next = node;
134-
node.next = cur;
129+
prev.next = node;
130+
node.next = curr;
135131
return head;
136132
}
137133
}
@@ -164,46 +160,56 @@ public:
164160
class Solution {
165161
public:
166162
Node* insert(Node* head, int insertVal) {
167-
Node* insert = new Node(insertVal);
168-
if (head == nullptr) {
169-
head = insert;
170-
head->next = head;
171-
} else if (head->next == nullptr) {
172-
head->next = insert;
173-
insert->next = head;
174-
} else {
175-
insertCore(head, insert);
176-
}
177-
178-
return head;
179-
}
180-
181-
void insertCore(Node* head, Node* insert) {
182-
Node* cur = head;
183-
Node* maxNode = head;
184-
Node* next = head->next;
185-
186-
while (!(cur->val <= insert->val && insert->val <= next->val) && next != head) {
187-
cur = cur->next;
188-
next = next->next;
189-
190-
if (cur->val >= maxNode->val)
191-
maxNode = cur;
163+
Node* node = new Node(insertVal);
164+
if (!head)
165+
{
166+
node->next = node;
167+
return node;
192168
}
193-
194-
if (cur->val <= insert->val && insert->val <= next->val) {
195-
insert->next = next;
196-
cur->next = insert;
197-
} else {
198-
insert->next = maxNode->next;
199-
maxNode->next = insert;
200-
169+
Node *prev = head, *curr = head->next;
170+
while (curr != head)
171+
{
172+
if ((prev->val <= insertVal && insertVal <= curr->val) || (prev->val > curr->val && (insertVal >= prev->val || insertVal <= curr->val))) break;
173+
prev = curr;
174+
curr = curr->next;
201175
}
202-
176+
prev->next = node;
177+
node->next = curr;
178+
return head;
203179
}
204180
};
205181
```
206182
183+
### **Go**
184+
185+
```go
186+
/**
187+
* Definition for a Node.
188+
* type Node struct {
189+
* Val int
190+
* Next *Node
191+
* }
192+
*/
193+
194+
func insert(head *Node, x int) *Node {
195+
node := &Node{Val: x}
196+
if head == nil {
197+
node.Next = node
198+
return node
199+
}
200+
prev, curr := head, head.Next
201+
for curr != head {
202+
if (prev.Val <= x && x <= curr.Val) || (prev.Val > curr.Val && (x >= prev.Val || x <= curr.Val)) {
203+
break
204+
}
205+
prev, curr = curr, curr.Next
206+
}
207+
prev.Next = node
208+
node.Next = curr
209+
return head
210+
}
211+
```
212+
207213
### **...**
208214

209215
```

0 commit comments

Comments
 (0)