Reverse a linked list from position m to n. Do it in-place and in one-pass.
For example:
Given
1->2->3->4->5->NULL, m = 2 and n = 4,return
1->4->3->2->5->NULL.Note:
Given m, n satisfy the following condition:
1 ? m ? n ? length of list.
----------------------------------------
lets say m = 3, n = 5
1 2 3 4 5 6
| | | |
head left tail newHead
/* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *reverseBetween(ListNode *head, int m, int n) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
ListNode *newHead = NULL, *itr = head,*left = NULL,*tail;
// move to m-th node
for (int i = 1; i < m; i++) {
left = itr;
itr = itr->next;
}
tail = itr;
// move to n-th node
for (int i = m; i <= n; i++) {
ListNode *temp = itr->next;
itr->next = newHead;
newHead = itr;
itr = temp;
}
tail->next = itr;
if (m == 1) {
return newHead;
}
left->next = newHead;
return head;
}
};
Convert Sorted List to Binary Search TreeGiven a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST.
--------------------------------------------------------------------------
Further reading:
http://leetcode.com/2010/11/convert-sorted-list-to-balanced-binary.html
http://www.geeksforgeeks.org/sorted-linked-list-to-balanced-bst/
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode* constructTree (ListNode *&list,int start, int end) {
if (start > end) {
return NULL;
}
int mid = start + (end - start) / 2;
TreeNode *left = constructTree(list,start,mid - 1);
TreeNode *root = new TreeNode(list->val);
root->left = left;
list = list->next;
root->right = constructTree(list,mid + 1, end);
return root;
}
TreeNode *sortedListToBST(ListNode *head) {
int n = 0;
ListNode *itr = head;
while (itr != NULL ) {
n++;
itr = itr->next;
}
return constructTree(head,0,n-1);
}
};
Update Nov-21-2014 Bottom up solution. For each node, build the left child -> root -> right child, follow the in order sequence