當前位置:
首頁 >
排序链表—leecode148
發布時間:2024/4/18
35
豆豆
生活随笔
收集整理的這篇文章主要介紹了
排序链表—leecode148
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在?O(n?log?n) 時間復雜度和常數級空間復雜度下,對鏈表進行排序。
示例 1:
輸入: 4->2->1->3
輸出: 1->2->3->4
示例 2:
輸入: -1->5->3->4->0
輸出: -1->0->3->4->5
思路1:暴力解決,拿出來,再放回去
?
/*** 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) {vector<int> temp;ListNode* h = head;while(h!=NULL){temp.push_back(h->val);h = h->next;}sort(temp.begin(),temp.end());ListNode* r = head;int i=0;while(r!=NULL){r->val = temp[i++];r = r->next;}return head;} };思路2:復雜度要求為nlog2n,能想到的就是快排,堆排,歸并排序。快排要找到第n個數由于是鏈表只能順序找,太慢了,所以pass;堆排的空間復雜度為O(n),pass,只剩下堆排了,利用快慢指針找到中間節點進行分段,合并利用合并兩個有序鏈表的方法,前面有這道題,然后就是遞歸了。
class Solution { public:ListNode* sortList(ListNode* head) {if(head == NULL || head->next == NULL) //遞歸出口return head;ListNode* head1 = head;ListNode* head2 = getMiddle(head);head1 = sortList(head1); //對前半段進行遞歸head2 = sortList(head2); //對后半段進行遞歸return merge(head1, head2);}//歸并ListNode* merge(ListNode* head1, ListNode* head2){ListNode* dummyHead = new ListNode(-1);ListNode* cur = dummyHead;while(head1 != NULL && head2 != NULL){if(head1->val > head2->val){cur->next = head2;head2 = head2->next;}else{cur->next = head1;head1 = head1->next;}cur = cur->next;}if(head1 == NULL)cur->next = head2;if(head2 == NULL)cur->next = head1;return dummyHead->next;}//獲取鏈表中間位置,并將鏈表從中間分為兩個鏈表ListNode* getMiddle(ListNode* head){//使用快慢節點方法尋找鏈表的中間節點ListNode *fast = head, *slow = head;while(fast->next != NULL && fast->next->next != NULL){slow = slow->next;fast = fast->next->next;}fast = slow;slow = slow->next; //第二個鏈表的首節點fast->next = NULL; //將原來的鏈表從中間斷開return slow; } };?
總結
以上是生活随笔為你收集整理的排序链表—leecode148的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LRU缓存机制—leetcode146
- 下一篇: 乘积最大子数组—leedcode152