日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

排序链表—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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。