LeetCode 148
Sort List
Problem Description:
对链表进行排序,但要求保证时间复杂度为O(n log n)。
具体的题目信息:
https://leetcode.com/problems/sort-list/description/Solution:
- 解题思路:考点其实就是排序算法,本题使用归并排序。
- 编程实现:
/**
* 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)
return head;
if (head->next == NULL)
return head;
ListNode* p = head;
vector<int> a;
while(p) {
a.push_back(p->val);
p = p->next;
}
mergeSort(a);
//用归并排序后的vector数组来构造链表
ListNode* q = new ListNode(a[0]);
head = q;
ListNode* temp;
for (int i = 1; i < a.size(); i++) {
temp = new ListNode(a[i]);
q->next = temp;
q = temp;
}
temp->next = NULL;
return head;
}
//合并,将两个有序vector中的元素进行合并
void merge(vector<int> &a, vector<int> &p, vector<int> &q) {
int p1 = 0, q1 = 0;
while(p1<p.size() || q1<q.size()) {
if (p1 >= p.size()) {
a.push_back(q[q1++]);
} else if (q1 >= q.size()) {
a.push_back(p[p1++]);
} else if (p[p1] < q[q1]) {
a.push_back(p[p1++]);
} else {
a.push_back(q[q1++]);
}
}
}
//递归分解
void mergeSort(vector<int> &a) {
if (a.size()<=1)
return;
vector<int> p;
vector<int> q;
for (int i = 0; i < a.size(); i++) {
if (i < a.size()/2) {
p.push_back(a[i]);
} else {
q.push_back(a[i]);
}
}
mergeSort(p);
mergeSort(q);
a.clear();
merge(a, p, q);
}
};