这个题是http://blog.sina.com.cn/s/blog_672f71fc0101os5r.html
该题目的变形,只是把数组换成了单链表,在单链表查找的时候注意优化,每次二分之后head节点对于left来说依然是head,但是对right来说head节点要更新为mid的那个节点。不然会超时。
class Solution { public: ListNode * GetListNthNode(ListNode * head,int n) { int k = 0; while(k < n) { k++; head = head->next; } return head; } int CountList(ListNode *head) { int count = -1; while(head != NULL) { head = head->next; count++; } return count; } TreeNode *BSearchT(int left,int right,ListNode * head) { if(right < left)return NULL; int mid = (left+right) / 2; TreeNode * root = new TreeNode(GetListNthNode(head,mid-left)->val); root->left = BSearchT(left,mid-1,head); root->right = BSearchT(mid+1,right,GetListNthNode(head,mid+1-left)); return root; } TreeNode *sortedListToBST(ListNode *head) { if(head == NULL) return NULL; int n = CountList(head); int mid = (0 + n) / 2; TreeNode * root = new TreeNode(GetListNthNode(head,mid)->val); root->left = BSearchT(0,mid-1,head); root->right = BSearchT(mid+1,n,GetListNthNode(head,mid+1)); return root; } };