[C++] LeetCode 148. 排序链表

xiaoxiao2021-02-28  18

题目

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

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

示例 2:

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

思路解析

这题可以采用两种方法,一个是利用multlimap,排序之后再讲节点连接成链表,但是会使用额外的空间。另外一种方法是通过归并排序。

代码一

/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: ListNode *mergeList(ListNode *l1,ListNode *l2){ ListNode dummy(-1),*root=&dummy; if(l1==NULL) return l2; if(l2==NULL) return l1; while(l1&&l2){ root->next=l1->val<=l2->val?l1:l2; if(l1->val<=l2->val) l1=l1->next; else l2=l2->next; root=root->next; } root->next=l1==NULL?l2:l1; return dummy.next; } ListNode* sortList(ListNode* head) { if(head==NULL||head->next==NULL) return head; ListNode *slow=head,*fast=head; while(slow->next&&fast->next&&fast->next->next){ slow=slow->next; fast=fast->next->next; } fast=slow->next; slow->next=NULL; ListNode *p1=sortList(head); ListNode *p2=sortList(fast); return mergeList(p1,p2); } };

代码二

/** * 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) { multimap<int,ListNode*> mul; while(head){ mul.insert(make_pair(head->val,head)); head=head->next; } ListNode dummy(-1); head=&dummy; for(auto it=mul.begin();it!=mul.end();it++){ head->next=it->second; head=head->next; } head->next=NULL; return dummy.next; } };
转载请注明原文地址: https://www.6miu.com/read-2632876.html

最新回复(0)