/*
Median of a Sorted Linked List
Given a sorted singly list of integers, return the median value.
Example
Input: 1 ⇒ 3 ⇒ 4 ⇒ 5 ⇒ 6 ⇒ 6 ⇒ 9
Output: 5
Input: 1 ⇒ 3 ⇒ 4 ⇒ 5 ⇒ 6 ⇒ 6 ⇒ 8 ⇒ 9
Output: 5.5
*/
// time complexity = O(n);
// space complexity = O(1);
#include <iostream>
using namespace std;
struct Node{
int data;
Node* next;
Node(int x) : data(x) , next(NULL) {}
};
void insert(Node*& head , int val){
if(!head){
head = new Node(val);
return;
}
Node* temp = head;
while(temp->next){
temp = temp->next;
}
temp->next = new Node(val);
}
double findmedian(Node* head){
Node* slow = head;
Node* fast = head;
Node* prev = NULL;
while(fast && fast->next){
prev = slow;
slow = slow->next;
fast = fast->next->next;
}
if(fast == NULL){
return double((prev->data + slow->data) / 2.0);
}
return slow->data;
}
int main() {
Node* head = NULL;
int arr[]={1};
int n = sizeof(arr) / sizeof(arr[0]);
for(int i = 0 ; i<n ; i++){
insert(head,arr[i]);
}
cout<<"Median is :"<< findmedian(head);
return 0;
}
LyoKTWVkaWFuIG9mIGEgU29ydGVkIExpbmtlZCBMaXN0CkdpdmVuIGEgc29ydGVkIHNpbmdseSBsaXN0IG9mIGludGVnZXJzLCByZXR1cm4gdGhlIG1lZGlhbiB2YWx1ZS4KRXhhbXBsZQpJbnB1dDogMSDih5IgMyDih5IgNCDih5IgNSDih5IgNiDih5IgNiDih5IgOQpPdXRwdXQ6IDUKCklucHV0OiAxIOKHkiAzIOKHkiA0IOKHkiA1IOKHkiA2IOKHkiA2IOKHkiA4IOKHkiA5Ck91dHB1dDogNS41CgoKKi8KCi8vIHRpbWUgY29tcGxleGl0eSA9IE8obik7Ci8vIHNwYWNlIGNvbXBsZXhpdHkgPSBPKDEpOwoKI2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKc3RydWN0IE5vZGV7CglpbnQgZGF0YTsKCU5vZGUqIG5leHQ7CglOb2RlKGludCB4KSA6IGRhdGEoeCkgLCBuZXh0KE5VTEwpIHt9Cn07Cgp2b2lkIGluc2VydChOb2RlKiYgaGVhZCAsIGludCB2YWwpewoJaWYoIWhlYWQpewoJCWhlYWQgPSBuZXcgTm9kZSh2YWwpOwoJCXJldHVybjsKCX0KCQoJTm9kZSogdGVtcCA9IGhlYWQ7Cgl3aGlsZSh0ZW1wLT5uZXh0KXsKCQl0ZW1wID0gdGVtcC0+bmV4dDsKCX0KCXRlbXAtPm5leHQgPSBuZXcgTm9kZSh2YWwpOwp9Cgpkb3VibGUgZmluZG1lZGlhbihOb2RlKiBoZWFkKXsKCU5vZGUqIHNsb3cgPSBoZWFkOwoJTm9kZSogZmFzdCA9IGhlYWQ7CglOb2RlKiBwcmV2ID0gTlVMTDsKCQoJd2hpbGUoZmFzdCAmJiBmYXN0LT5uZXh0KXsKCQlwcmV2ID0gc2xvdzsKCQlzbG93ID0gc2xvdy0+bmV4dDsKCQlmYXN0ID0gZmFzdC0+bmV4dC0+bmV4dDsKCX0KCQoJaWYoZmFzdCA9PSBOVUxMKXsKCQlyZXR1cm4gZG91YmxlKChwcmV2LT5kYXRhICsgc2xvdy0+ZGF0YSkgLyAyLjApOwoJfQoJCglyZXR1cm4gc2xvdy0+ZGF0YTsKfQppbnQgbWFpbigpIHsKCQoJTm9kZSogaGVhZCA9IE5VTEw7CgkKCWludCBhcnJbXT17MX07CglpbnQgbiA9IHNpemVvZihhcnIpIC8gc2l6ZW9mKGFyclswXSk7CgkKCWZvcihpbnQgaSA9IDAgOyBpPG4gOyBpKyspewoJCWluc2VydChoZWFkLGFycltpXSk7Cgl9Cgljb3V0PDwiTWVkaWFuIGlzIDoiPDwgZmluZG1lZGlhbihoZWFkKTsKCXJldHVybiAwOwp9