Skip to content

Commit db3101d

Browse files
committed
update
1 parent eb1503f commit db3101d

File tree

13 files changed

+216
-138
lines changed

13 files changed

+216
-138
lines changed

AddTwoNumbers/AddTwoNumbers.cpp

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,23 @@ struct ListNode {
2323
ListNode(int x) : val(x), next(NULL) {}
2424
};
2525

26+
ListNode * pushDummy(ListNode * head) {
27+
ListNode * newNode = new ListNode(-1);
28+
newNode->next = head;
29+
return newNode;
30+
}
31+
32+
ListNode * popDummy(ListNode * head) {
33+
ListNode * delNode = head;
34+
head = head->next;
35+
delete delNode;
36+
return head;
37+
}
38+
2639
class Solution {
2740
public:
2841
ListNode *addTwoNumbers(ListNode *l1, ListNode *l2) {
29-
ListNode * l3 = new ListNode(-1), *cur = l3;
42+
ListNode * l3 = pushDummy(NULL), *cur = l3;
3043
int sum = 0;
3144
while (l1 != NULL || l2 != NULL) {
3245
if (l1 != NULL) sum += l1->val, l1 = l1->next;
@@ -35,15 +48,8 @@ class Solution {
3548
cur = cur->next;
3649
sum /= 10;
3750
}
38-
if (sum != 0) cur->next = new ListNode(sum);
39-
return deleteNode(l3);
40-
}
41-
42-
ListNode* deleteNode(ListNode * cur) {
43-
ListNode *toDel = cur;
44-
cur = cur->next;
45-
delete toDel;
46-
return cur;
51+
if (sum > 0) cur->next = new ListNode(sum);
52+
return popDummy(l3);
4753
}
4854
};
4955

GrayCode/GrayCode.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,10 @@ using namespace std;
2424
class Solution {
2525
public:
2626
vector<int> grayCode(int n) {
27+
return grayCode1(n);
28+
}
29+
30+
vector<int> grayCode1(int n) {
2731
vector<int> res;
2832
res.reserve(1 << n);
2933
res.push_back(0);
@@ -35,6 +39,12 @@ class Solution {
3539
}
3640
return res;
3741
}
42+
43+
vector<int> grayCode2(int n) {
44+
vector<int> res;
45+
for (int i = 0; i < (1 << n); i++) res.push_back(i ^ (i >> 1));
46+
return res;
47+
}
3848
};
3949

4050
int main() {

LRUCache/LRUCache.cpp

Lines changed: 29 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,12 @@
1818

1919
using namespace std;
2020

21+
struct CacheNode {
22+
int key;
23+
int value;
24+
CacheNode(int k, int v) : key(k), value(v) {};
25+
};
26+
2127
class LRUCache{
2228
public:
2329
LRUCache(int capacity) {
@@ -26,25 +32,36 @@ class LRUCache{
2632

2733
int get(int key) {
2834
if (!_map.count(key)) return -1;
29-
auto it = _map[key];
30-
_list.push_front(*it);
31-
_list.erase(it);
32-
it = _list.begin();
33-
_map[key] = it;
34-
return it->second;
35+
move(key);
36+
return _map[key]->value;
3537
}
3638

3739
void set(int key, int value) {
38-
if (_map.count(key)) _list.erase(_map[key]), _map.erase(key);
39-
else if (_map.size() == _cap) _map.erase(_list.back().first), _list.pop_back();
40-
_list.push_front(make_pair(key, value));
41-
_map[key] = _list.begin();
40+
if (_map.count(key)) {
41+
_map[key]->value = value;
42+
move(key);
43+
}
44+
else {
45+
if (_cap == _map.size()) {
46+
_map.erase(_list.back().key);
47+
_list.pop_back();
48+
}
49+
_list.push_front(CacheNode(key, value));
50+
_map[key] = _list.begin();
51+
}
4252
}
4353

4454
private:
55+
void move(int key) {
56+
auto it = _map[key];
57+
_list.push_front(*it);
58+
_list.erase(it);
59+
_map[key] = _list.begin();
60+
}
61+
4562
int _cap;
46-
list<pair<int, int> > _list;
47-
unordered_map<int, list<pair<int, int> >::iterator> _map;
63+
list<CacheNode> _list;
64+
unordered_map<int, list<CacheNode>::iterator> _map;
4865
};
4966

5067
int main() {

MergeIntervals/MergeIntervals.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
// return [1,6],[8,10],[15,18].
77
//
88
// Complexity:
9-
// O(n)
9+
// O(nlog(n))
1010
//============================================================================
1111

1212
#include <iostream>

RemoveDuplicatesfromSortedList/RemoveDuplicatesfromSortedList.cpp

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -26,19 +26,17 @@ struct ListNode {
2626
class Solution {
2727
public:
2828
ListNode *deleteDuplicates(ListNode *head) {
29-
ListNode * cur = head;
30-
while (cur != NULL && cur->next != NULL) {
31-
if (cur->val == cur->next->val) cur->next = deleteNode(cur->next);
32-
else cur = cur->next;
29+
if (head == NULL || head->next == NULL) return head;
30+
ListNode * curNode = head;
31+
while (curNode != NULL && curNode->next != NULL) {
32+
if (curNode->val == curNode->next->val) {
33+
ListNode * nextNode = curNode->next;
34+
curNode->next = nextNode->next;
35+
delete nextNode;
36+
}
37+
else curNode = curNode->next;
3338
}
34-
return head;
35-
}
36-
37-
ListNode* deleteNode(ListNode * cur) {
38-
ListNode *toDel = cur;
39-
cur = cur->next;
40-
delete toDel;
41-
return cur;
39+
return head;
4240
}
4341
};
4442

RemoveDuplicatesfromSortedListII/RemoveDuplicatesfromSortedListII.cpp

Lines changed: 21 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -23,36 +23,40 @@ struct ListNode {
2323
ListNode(int x) : val(x), next(NULL) {}
2424
};
2525

26+
27+
ListNode * pushHead(ListNode * head) {
28+
ListNode * newNode = new ListNode(-1);
29+
newNode->next = head;
30+
return newNode;
31+
}
32+
33+
ListNode * popHead(ListNode * head) {
34+
ListNode * delNode = head;
35+
head = head->next;
36+
delete delNode;
37+
return head;
38+
}
39+
2640
class Solution {
2741
public:
2842
ListNode *deleteDuplicates(ListNode *head) {
29-
ListNode * newNode = new ListNode(-1);
30-
newNode->next = head;
31-
head = newNode;
43+
if (head == NULL || head->next == NULL) return head;
44+
head = pushHead(head);
3245
ListNode * preNode = head, *curNode = head->next;
3346
while (curNode != NULL) {
3447
ListNode * nextNode = curNode->next;
35-
while (nextNode != NULL && nextNode->val == curNode->val) nextNode = nextNode->next;
36-
if (curNode->next == nextNode) {
37-
preNode = curNode;
38-
curNode = nextNode;
39-
}
48+
while (nextNode != NULL && curNode->val == nextNode->val) nextNode = nextNode->next;
49+
if (curNode->next == nextNode) preNode = curNode, curNode = nextNode;
4050
else {
4151
preNode->next = nextNode;
42-
while (curNode != nextNode) curNode = deleteNode(curNode);
52+
while (curNode != nextNode) curNode = popHead(curNode);
4353
}
4454
}
45-
return deleteNode(head);
46-
}
47-
48-
ListNode* deleteNode(ListNode * cur) {
49-
ListNode *toDel = cur;
50-
cur = cur->next;
51-
delete toDel;
52-
return cur;
55+
return popHead(head);
5356
}
5457
};
5558

59+
5660
int main() {
5761
Solution sol;
5862

RemoveNthNodeFromEndofList/RemoveNthNodeFromEndofList.cpp

Lines changed: 21 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -29,26 +29,30 @@ struct ListNode {
2929
ListNode(int x) : val(x), next(NULL) {};
3030
};
3131

32+
ListNode * pushHead(ListNode * head) {
33+
ListNode * newNode = new ListNode(-1);
34+
newNode->next = head;
35+
return newNode;
36+
}
37+
38+
ListNode * popHead(ListNode * head) {
39+
ListNode * delNode = head;
40+
head = head->next;
41+
delete delNode;
42+
return head;
43+
}
44+
3245
class Solution {
3346
public:
3447
ListNode *removeNthFromEnd(ListNode *head, int n) {
35-
if (head == NULL || n < 1) return head;
36-
ListNode * newNode = new ListNode(-1);
37-
newNode->next = head;
38-
head = newNode;
39-
ListNode * slow = head, *fast = head;
40-
while (n > 0 && fast->next != NULL) fast = fast->next, n--;
41-
if (n > 0) return deleteNode(head);
42-
while (fast->next != NULL) fast = fast->next, slow = slow->next;
43-
slow->next = deleteNode(slow->next);
44-
return deleteNode(head);
45-
}
46-
47-
ListNode* deleteNode(ListNode * cur) {
48-
ListNode *toDel = cur;
49-
cur = cur->next;
50-
delete toDel;
51-
return cur;
48+
head = pushHead(head);
49+
ListNode * fastNode = head;
50+
for (; n > 0 && fastNode != NULL; n--) fastNode = fastNode->next;
51+
if (fastNode == NULL) return popHead(head);
52+
ListNode * slowNode = head;
53+
for (; fastNode->next != NULL; fastNode = fastNode->next) slowNode = slowNode->next;
54+
slowNode->next = popHead(slowNode->next)
55+
return popHead(head);
5256
}
5357
};
5458

ReverseLinkedListII/ReverseLinkedListII.cpp

Lines changed: 22 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -23,31 +23,36 @@ struct ListNode {
2323
ListNode(int x) : val(x), next(NULL) {}
2424
};
2525

26+
ListNode * pushDummy(ListNode * head) {
27+
ListNode * newNode = new ListNode(-1);
28+
newNode->next = head;
29+
return newNode;
30+
}
31+
32+
ListNode * popDummy(ListNode * head) {
33+
ListNode * delNode = head;
34+
head = head->next;
35+
delete delNode;
36+
return head;
37+
}
38+
2639
class Solution {
2740
public:
2841
ListNode *reverseBetween(ListNode *head, int m, int n) {
29-
ListNode * newHead = new ListNode(-1);
30-
newHead->next = head;
31-
ListNode * preNode = NULL, * curNode = newHead;
32-
for (int i = 0; i < m; i++) preNode = curNode, curNode = curNode->next;
33-
ListNode * preTail = preNode;
34-
preNode = NULL;
35-
for (int i = 0; i <= n-m; i++) {
42+
if (head == NULL || m < 1 || n < 1 || m > n) return head;
43+
head = pushDummy(head);
44+
ListNode * curNode = head, *lastNode = NULL;
45+
for (; m > 0; m--, n--) lastNode = curNode, curNode = curNode->next;
46+
ListNode *preNode = NULL;
47+
for (; n >= 0; n--) {
3648
ListNode * nextNode = curNode->next;
3749
curNode->next = preNode;
3850
preNode = curNode;
3951
curNode = nextNode;
4052
}
41-
preTail->next->next = curNode;
42-
preTail->next = preNode;
43-
return deleteNode(newHead);
44-
}
45-
46-
ListNode * deleteNode(ListNode * curNode) {
47-
ListNode * toDel = curNode;
48-
curNode = curNode->next;
49-
delete toDel;
50-
return curNode;
53+
lastNode->next->next = curNode;
54+
lastNode->next = preNode;
55+
return popDummy(head);
5156
}
5257
};
5358

0 commit comments

Comments
 (0)