题目:在O(n log n)的时间内对链表进行升序排序
思路:时间复杂度为O(n log n),我们很自然的想到使用二分法将链表不断分割成等长的两部分,然后对两部分进行升序排列,两两合并递归。这样,我们就需要设计两个函数,第一个函数是可以将链表无限切割为两部分,这个可以通过使用快慢指针来实现;第二个函数则是将链表的两部分按照升序进行合并。
实现过程:
首先定义链表的数据结构ListNode:
struct ListNode {//链表数据结构
int val;//结点值
ListNode* next;//结点中指向下一个结点的指针
ListNode(int x) : val(x), next(NULL) {}//结点的自定义构造函数
};
实现链表的二分法sortList(),使用两个指针,一个慢指针开始指向头结点,每次循环往后遍历一位;一个快指针开始指向头结点的下一个结点,每次循环往后遍历两位,直到遍历到末端的结点,此时,慢指针指向的位置就是整个链表的中点。根据此中点将链表一分为二,然后再分别对两个部分实现该切割操作。返回值部分调用升序合并的函数merge()。
ListNode* sortList(ListNode* head) {//将整个链表使用递归式的二分法,进行排序
if (!head || !head->next) {
return head;
}