Sort List
2015-07-07 22:40
281 查看
Sort a linked list in O(n log n) time using constant space complexity.
一看到这个题目,首先想到归并排序。归并排序需要将数据近似划成两等分,可以用快慢指针法,慢指针一次走一步,快指针一次走两步,快指针走到链表末尾时,慢指针刚好走到一半。本题的递归解法如下:
一看到这个题目,首先想到归并排序。归并排序需要将数据近似划成两等分,可以用快慢指针法,慢指针一次走一步,快指针一次走两步,快指针走到链表末尾时,慢指针刚好走到一半。本题的递归解法如下:
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: ListNode* sortList(ListNode* head) { if(head == NULL || head->next == NULL) { return head; } ListNode* p1 = head; ListNode* p2 = head; ListNode* head1 = head; ListNode* head2 = head; while(p2) { p2 = p2->next; if(p2) { p2 = p2->next; } if(!p2) { head1 = p1->next; p1->next = NULL; } else { p1 = p1->next; } } head2 = sortList(head1); head1 = sortList(head); ListNode* p = head1; p1 = head1; p2 = head2; if(head2->val < head1->val) { p = head2; p2 = p2->next; } else { p1 = p1->next; } head = p; while(p1 && p2) { if(p1->val < p2->val) { p->next = p1; p = p->next; p1 = p1->next; } else { p->next = p2; p = p->next; p2 = p2->next; } } while(p1) { p->next = p1; p = p->next; p1 = p1->next; } while(p2) { p->next = p2; p = p->next; p2 = p2->next; } return head; } };
相关文章推荐
- eclipse启动时提示 A Java Runtime Environment or Java Development Kit must be available to run Eclipse
- Ruby on Rails 使用mysql数据库 use local and remote mysql in development production environments in Ruby o
- C语言非递归实现字符串逆转
- IOS Objective-c 内存管理
- KB2464222导致IsNonIdempotentProperty方法找不见
- SurfaceView类透明背景设置
- Java的Main方法、Java文件、函数调用的执行过程
- Android开发之 android:windowSoftInputMode属性详解
- Web数据采集(抓取)介绍
- Unix网络编程中第一个例子出现connect error: Connection refused
- PCA转载,好文章
- 【LeetCode】3 Longest Substring Without Repeating Characters
- UVA 10010 Where's Waldorf?
- 【作业一】林轩田机器学习技术
- HTML5学习笔记-2.HTML基础
- shell脚本中echo显示内容带颜色
- 每天一个linux命令(6):rmdir 命令
- SQL索引一步到位
- Android中URI的解释
- bootstrap-table(三)