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; } };
相关文章推荐
- Leetcode 82 删除排序链表中的重复元素 II Python C++ 史上最详细题解系列
- Leetcode 83 删除排序链表中的重复元素 Python C++ 史上最详细题解系列
- LeetCodet题解--21. Merge Two Sorted Lists(合并两个排序好的链表)
- LeetCode 23 Merge k Sorted Lists(合并K个已排序链表)
- Leetcode 23 python 合并K个排序链表
- @LeetCode合并K个排序链表--Merge k Sorted Lists[C++]
- 【LeetCode题目记录-8】从排序后的单链表中去除重复元素
- Leetcode 148. 排序链表
- [LeetCode]83. Remove Duplicates from Sorted List(排序链表去重)
- 链表排序(LeetCode 148)
- [C++]LeetCode 19: Remove Nth Node From End of List(删除链表中倒数第n个节点)
- C++链表的建立,排序,删除
- leetcode 链表排序
- LeetCode题解(python)-23. 合并K个排序链表
- [C/C++标准库]_[初级]_[对C链表排序]
- LeetCode-21- Merge Two Sorted Lists(合并两个已排序链表)
- leetcode_c++:链表:Insertion Sort List(147)
- leetcode_c++:链表:Remove Linked List Elements(203)
- 【编程题目】合并两个排序链表(C++实现)
- LeetCode 206: 反转链表 C++实现