摘要:題目要求用的時間復(fù)雜度和的空間復(fù)雜度檢索一個鏈表。那么問題就歸結(jié)為如何將鏈表分為大小相近的兩半以及如何將二者合并。之后再對折斷的鏈表分別進(jìn)行計算從而確保每一段內(nèi)的元素為有序的。
題目要求
Sort a linked list in O(n log n) time using constant space complexity.
用O(n log n)的時間復(fù)雜度和O(1)的空間復(fù)雜度檢索一個鏈表。
思路和代碼在給出了明確的時間復(fù)雜度和空間復(fù)雜度后,我第一個想到的就是利用divide and conquer 方法進(jìn)行排序。那么問題就歸結(jié)為如何將鏈表分為大小相近的兩半以及如何將二者合并。
了解利用分治法對數(shù)組進(jìn)行排序的童鞋應(yīng)該知道,我們會根據(jù)數(shù)組的下標(biāo)將數(shù)組取一半分別進(jìn)行排序后,再將排序好的二者進(jìn)行合并。
那么將鏈表分為大小相近的兩部分則需要我們用三個指針來進(jìn)行。分別是prev, slow和fast,其中fast指針每次往前跑兩步,slow往前跑一步,這樣確保slow指針是第二部分開頭的第一個指針,而prev則是slow指針的前一個指針。prev指針是用來折斷鏈表的。
ListNode prev = null, slow = head, fast = head; while(fast!=null && fast.next!=null){ prev = slow; slow = slow.next; fast = fast.next.next; } prev.next = null;
之后再對折斷的鏈表分別進(jìn)行計算從而確保每一段內(nèi)的元素為有序的。
之后我們需要將相鄰的兩段鏈表進(jìn)行合并,這個就很簡單了。只需要另設(shè)一個頭指針,并每次比較兩段的當(dāng)前節(jié)點,取較小的節(jié)點加入頭指針即可。
所有代碼如下:
public ListNode sortList(ListNode head) { if(head == null || head.next == null) return head; ListNode prev = null, slow = head, fast = head; while(fast!=null && fast.next!=null){ prev = slow; slow = slow.next; fast = fast.next.next; } prev.next = null; ListNode l1 = sortList(head); ListNode l2 = sortList(slow); return merge(l1, l2); } public ListNode merge(ListNode l1, ListNode l2){ ListNode dummy = new ListNode(0); ListNode cur = dummy; while(l1!=null && l2!=null){ if(l1.val < l2.val){ ListNode tmp = l1.next; cur.next = l1; l1.next = null; l1 = tmp; }else{ ListNode tmp = l2.next; cur.next = l2; l2.next = null; l2 = tmp; } cur = cur.next; } if(l1==null) cur.next = l2; else cur.next = l1; return dummy.next; }
想要了解更多開發(fā)技術(shù),面試教程以及互聯(lián)網(wǎng)公司內(nèi)推,歡迎關(guān)注我的微信公眾號!將會不定期的發(fā)放福利哦~
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/68184.html
Problem Sort a linked list in O(n log n) time using constant space complexity. Example 1: Input: 4->2->1->3 Output: 1->2->3->4 Example 2: Input: -1->5->3->4->0 Output: -1->0->3->4->5 Solution Merge S...
摘要:有效三角形的個數(shù)雙指針最暴力的方法應(yīng)該是三重循環(huán)枚舉三個數(shù)字。總結(jié)本題和三數(shù)之和很像,都是三個數(shù)加和為某一個值。所以我們可以使用歸并排序來解決這個問題。注意因為歸并排序需要遞歸,所以空間復(fù)雜度為 ...
摘要:題目解答對于中第二個最優(yōu)解的解釋根據(jù)時間復(fù)雜度的要求,很容易想到應(yīng)該用的方法來做,那么就有兩個步驟,分和法。 題目:Sort a linked list in O(n log n) time using constant space complexity. 解答:(對于discuss中第二個最優(yōu)解的解釋)根據(jù)時間復(fù)雜度的要求,很容易想到應(yīng)該用merge sort的方法來做,那么就有兩個...
摘要:題目分析一看到問題,而且時間復(fù)雜度要求又是,很自然地就會想到數(shù)組時,如下這道題要求是,所以在上面的基礎(chǔ)上還要進(jìn)行一些額外操作找到的中點,使用快慢指針法。需要注意的是,找到中點后要把鏈表分成兩段,即兩個鏈表。這部分代碼應(yīng)該近似于這道題的答案。 Sort a linked list in O(n log n) time using constant space complexity. 題...
摘要:方法上沒太多難點,先按所有區(qū)間的起點排序,然后用和兩個指針,如果有交集進(jìn)行操作,否則向后移動。由于要求的,就對原數(shù)組直接進(jìn)行操作了。時間復(fù)雜度是的時間。 Problem Given a collection of intervals, merge all overlapping intervals. Example Given intervals => merged intervals...
閱讀 2679·2021-11-18 10:02
閱讀 3411·2021-09-28 09:35
閱讀 2591·2021-09-22 15:12
閱讀 749·2021-09-22 15:08
閱讀 3086·2021-09-07 09:58
閱讀 3469·2021-08-23 09:42
閱讀 731·2019-08-30 12:53
閱讀 2081·2019-08-29 13:51