1、非递归
| |
| class Solution { |
| public: |
| ListNode* sortList(ListNode* head) { |
| if (head == nullptr) |
| return head; |
| int length = 0; |
| ListNode* node = head; |
| while (node != nullptr) { |
| length++; |
| node = node->next; |
| } |
| ListNode* dummyHead = new ListNode(0, head); |
| for (int subLength = 1; subLength < length; subLength *= 2) { |
| ListNode *prev = dummyHead, *curr = dummyHead->next; |
| while (curr != nullptr) { |
| ListNode* head1 = curr; |
| |
| for (int i = 1; i < subLength && curr->next != nullptr; ++i) |
| curr = curr->next; |
| ListNode* head2 = curr->next; |
| curr->next = nullptr; |
| curr = head2; |
| if (curr == nullptr) { |
| ListNode* merged = merge(head1, head2); |
| prev->next = merged; |
| break; |
| } |
| |
| for (int i = 1; i < subLength && curr->next != nullptr; ++i) { |
| curr = curr->next; |
| } |
| |
| ListNode* next = nullptr; |
| if (curr->next != nullptr) { |
| next = curr->next; |
| curr->next = nullptr; |
| } |
| ListNode* merged = merge(head1, head2); |
| prev->next = merged; |
| while (prev->next != nullptr) { |
| prev = prev->next; |
| } |
| curr = next; |
| } |
| } |
| return dummyHead->next; |
| } |
| |
| ListNode* merge(ListNode* head1, ListNode* head2) { |
| ListNode* dummmy = new ListNode(); |
| ListNode* p = dummmy; |
| while (head1 && head2) { |
| if (head1->val < head2->val) { |
| p->next = head1; |
| head1 = head1->next; |
| } else { |
| p->next = head2; |
| head2 = head2->next; |
| } |
| p = p->next; |
| } |
| if (head1) { |
| p->next = head1; |
| } else { |
| p->next = head2; |
| } |
| p = dummmy->next; |
| delete dummmy; |
| return p; |
| } |
| }; |
2、递归
| |
| class Solution { |
| public: |
| ListNode* sortList(ListNode* head) { |
| return sortList(head, nullptr); |
| } |
| ListNode* sortList(ListNode* head1, ListNode* head2) |
| { |
| |
| if (head1 == nullptr) |
| return head1; |
| if (head1->next == head2) |
| { |
| head1->next = nullptr; |
| return head1; |
| } |
| |
| ListNode* fast = head1, * slow = head1; |
| while (fast != head2) |
| { |
| fast = fast->next; |
| slow = slow->next; |
| if (fast != head2) |
| fast = fast->next; |
| } |
| ListNode* l1 = sortList(head1, slow); |
| ListNode* l2 = sortList(slow, head2); |
| return merge(l1, l2); |
| } |
| |
| ListNode* merge(ListNode* head1, ListNode* head2) |
| { |
| ListNode* dummmy = new ListNode(); |
| ListNode* p = dummmy; |
| while (head1 && head2) |
| { |
| if (head1->val < head2->val) |
| { |
| p->next = head1; |
| head1 = head1->next; |
| } |
| else |
| { |
| p->next = head2; |
| head2 = head2->next; |
| } |
| p = p->next; |
| } |
| if (head1) |
| p->next = head1; |
| else |
| p->next = head2; |
| p = dummmy->next; |
| delete dummmy; |
| return p; |
| } |
| }; |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话