您的位置:首页 > 编程语言 > C语言/C++

LeetCode排序链表C++版

2019-06-28 15:26 726 查看

题目描述:

O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序。

示例 1:

输入: 4->2->1->3
输出: 1->2->3->4

示例 2:

输入: -1->5->3->4->0
输出: -1->0->3->4->5

C++代码如下:

/**
* 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) {
ListNode dummyHead(0);
dummyHead.next = head;
auto p = head;
int length = 0;
while (p) {
++length;
p = p->next;
}

for (int size = 1; size < length; size <<= 1) {
auto cur = dummyHead.next;
auto tail = &dummyHead;

while (cur) {
auto left = cur;
auto right = cut(left, size);
cur = cut(right, size);

tail->next = merge(left, right);
while (tail->next) {
tail = tail->next;
}
}
}
return dummyHead.next;

}
ListNode* cut(ListNode* head,int n){
auto p = head;
while(p && --n){
p = p->next;
}
if (!p) return nullptr;

auto next = p->next;
p->next = nullptr;
return next;
}

ListNode* merge(ListNode* l1,ListNode* l2){
ListNode dummyHead(0);
auto p = &dummyHead;
while(l1 && l2){
if(l1->val<l2->val){
p->next = l1;
p = l1;
l1 = l1->next;
}
else{
p->next = l2;
p = l2;
l2 = l2->next;
}
}
p->next = l1 ? l1:l2;
return dummyHead.next;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: