Leetcode, SortList
#include <iostream>
#include <vector>
using namespace std;
struct ListNode
{
int val;
ListNode *next;
ListNode(int v) : val(v), next(nullptr) {}
};
void printList(ListNode *head)
{
for (auto p = head; p; p = p->next)
{
cout << p->val << endl;
}
}
ListNode *createList(const vector<int> &vec)
{
ListNode dummy(-1);
ListNode *pDum = &dummy;
//尾插法
for (auto &val : vec)
{
auto node = new ListNode(val);
pDum->next = node;
pDum = pDum->next;
}
return dummy.next;
}
ListNode *mergeTwoSortedLists(ListNode *list1, ListNode *list2)
{
ListNode dummy(-1);
for (ListNode *p = &dummy; list1 != nullptr || list2 != nullptr; p = p->next)
{
int val1 = list1 == nullptr ? INT_MAX : list1->val;
int val2 = list2 == nullptr ? INT_MAX : list2->val;
if (val1 <= val2)
{
p->next = list1;
list1 = list1->next;
}
else
{
p->next = list2;
list2 = list2->next;
}
}
return dummy.next;
}
//单链表使用归并排序,双链表使用快速排序
//归并排序,时间复杂度O(nlogn),空间复杂度O(1)
ListNode *solution(ListNode *head)
{
if (head == nullptr || head->next == nullptr) return head;
//快慢指针找出中间节点
ListNode *fast = head ,*slow = head;
while ( fast->next != nullptr && fast->next->next != nullptr )
{
fast = fast->next->next;
slow = slow->next;
}
//断开
fast = slow;
slow = slow->next;
fast->next = nullptr;
ListNode *l1 = solution(head); //前端排序
ListNode *l2 = solution(slow); //后端排序
return mergeTwoSortedLists(l1, l2);
}
int main()
{
{
ListNode *list = solution(createList({ 4, 2, 1, 3 }));
printList(list);
cout << endl;
}
{
ListNode *list = solution(createList({ -1, 5, 3, 4, 0 }));
printList(list);
cout << endl;
}
return 0;
}