我之前一直想不明白这个题,归并排序我是想到的,但是我觉得归并怎么可能不利用额外的空间呢?后来看了高人解答以后恍然大悟,在对链表进行归并排序的时候,还真是不需要额外空间的!那么这个题就很简单了。
本题的另一亮点就是,我学会了如何合并两个链表,在上一篇博文中我使用了异常复杂且容易出错的方法,而在这次的代码里,明显好理解了很多。主要就是另使用一个指针指向合并完成的部分,这样就完全类似于两个数组进行归并了,三个指针分别指向未处理部分1,未处理部分2和空槽的开始部分。
/**
* 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 *fast = head, *slow = head;
while (fast->next != NULL && fast->next->next != NULL) {
fast = fast->next->next;
slow = slow->next;
}
ListNode *p = slow->next;
slow->next = NULL;
return merge(sortList(head), sortList(p));
}
ListNode *merge(ListNode *p, ListNode *q) {
ListNode fake(INT_MIN);
ListNode *r = &fake;
while (p != NULL && q != NULL) {
if (p->val >= q->val) {
r->next = q;
q = q->next;
}
else {
r->next = p;
p = p->next;
}
r = r->next;
}
if (p != NULL)
r->next = p;
if (q != NULL)
r->next = q;
return fake.next;
}
};
http://oj.leetcode.com/problems/sort-list/