-
Notifications
You must be signed in to change notification settings - Fork 0
/
L49-2.cpp
74 lines (60 loc) · 1.52 KB
/
L49-2.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
// Sort a linked list
/********************************
class Node
{
public:
int data;
Node *next;
Node(int data)
{
this->data = data;
this->next = NULL;
}
};
********************************/
void insertAtTail(Node* &tail, Node* curr ) {
tail -> next = curr;
tail = curr;
}
Node* sortList(Node *head)
{
Node* zeroHead = new Node(-1);
Node* zeroTail = zeroHead;
Node* oneHead = new Node(-1);
Node* oneTail = oneHead;
Node* twoHead = new Node(-1);
Node* twoTail = twoHead;
Node* curr = head;
// create separate list 0s, 1s and 2s
while(curr != NULL) {
int value = curr -> data;
if(value == 0) {
insertAtTail(zeroTail, curr);
}
else if(value == 1) {
insertAtTail(oneTail, curr);
}
else if(value == 2) {
insertAtTail(twoTail, curr);
}
curr = curr -> next;
}
//merge 3 sublist
// 1s list not empty
if(oneHead -> next != NULL) {
zeroTail -> next = oneHead -> next;
}
else {
//1s list -> empty
zeroTail -> next = twoHead -> next;
}
oneTail -> next = twoHead -> next;
twoTail -> next = NULL;
//setup head
head = zeroHead -> next;
//delete dummy nodes
delete zeroHead;
delete oneHead;
delete twoHead;
return head;
}