April 05, 2021
map
Edit me
#. Problem
1. My approach
Since it’s one way linked list, i had to store all the data to compare left, and right directions at the same time. So, I used String to store them (since it was 1 digit, if it were more than one I could’ve used separators), and check if it is Palindrome.
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
bool isPalindrome(ListNode* head) {
if(head == NULL) return false;
string temp = "";
while(head != NULL){
temp += to_string(head->val);
head = head->next;
}
for(int i = 0, j = temp.size()-1; i <= j; i++, j--){
if(temp[i] != temp[j]){
return false;
}
}
return true;
}
};
Time - O(N) | Space - O(1) |
---|---|
332 ms | 120.4 MB |
But it turned out that it takes way more time to append string, it was way faster in Vector. and also very efficient in space.
class Solution {
public:
bool isPalindrome(ListNode* head) {
vector<int> v;
while(head != NULL){
v.push_back(head->val);
head = head->next;
}
for(int i = 0, j = v.size()-1; i <= j; i++,j--){
if(v[i] != v[j]) return false;
}
return true;
}
};
Time - O(N) | Space - O(N) |
---|---|
28 ms | 15.1 MB |
2. Different solution
Without making any other structure
class Solution {
public:
bool isPalindrome(ListNode* head) {
if(!head || !head -> next){
return true;
}
ListNode* slow = head, *fast = head;
// when fast goes to the end, slow will be in the middle(1/2)
while(fast->next && fast->next->next){
slow = slow -> next;
fast = fast -> next -> next;
}
// making a reverse linked list from slow to 1
slow -> next = reverseList(slow -> next);
slow = slow -> next;
// comparison
while(slow){
if(head -> val != slow -> val){
return false;
}
head = head -> next;
slow = slow -> next;
}
return true;
}
ListNode* reverseList(ListNode* head){
ListNode *prev =nullptr, *next;
while(head){
next = head -> next;
head -> next = prev;
prev = head;
head = next;
}
return prev;
}
};
Time = O(N) | Space - O(1) |
---|---|
16 ms | 9.7 MB |
3. Epilogue
What I’ve learned from this exercise:
- Be creative… I guess concentrate more?