1. 程式人生 > >LeetCode------sort-list

LeetCode------sort-list

body gin tco 指針 post 直接 nod n) 歸並

題目:

Sort a linked list in O(n log n) time using constant space complexity.

題意:對一個單鏈表進行排序操作,要求時間復雜度為 O(n log n),看到這裏很明顯想到的是歸並排序,直接上代碼:

 1 public class Solution {
 2     /*
 3     類似於數組的歸並操作,我們要找到中間位置一樣,在單鏈表的歸並操作中,我們同樣
 4     要找到中間節點,下面函數的作用就是找到單鏈表的中間節點,
 5     在函數裏面我利用快慢指針來進行。
 6     */
 7     public
ListNode getMidNode(ListNode list) 8 { 9 if(list == null) 10 { 11 return null; 12 } 13 ListNode slow = list; 14 ListNode fast = list; 15 while(fast.next != null && fast.next.next != null) 16 { 17 slow = slow.next;
18 fast = fast.next.next; 19 } 20 return slow; 21 } 22 /* 23 該函數的作用就是鏈表之間的歸並操作,類似於數組之間的歸並操作。 24 */ 25 public ListNode mergeList(ListNode p1,ListNode p2) 26 { 27 if(p1 == null) 28 { 29 return p2; 30 } 31 if(p2 == null
) 32 { 33 return p1; 34 } 35 36 ListNode p_1 = p1; 37 ListNode p_2 = p2; 38 ListNode pTemp = null; 39 ListNode pHead = new ListNode(0); 40 if(p_1.val >= p_2.val) 41 { 42 pTemp = p_2; 43 p_2 = p_2.next; 44 }else 45 { 46 pTemp = p_1; 47 p_1 = p_1.next; 48 } 49 pHead.next = pTemp; 50 while(p_1 != null && p_2 != null) 51 { 52 if(p_1.val >= p_2.val) 53 { 54 pTemp.next = p_2; 55 pTemp = p_2; 56 p_2 = p_2.next; 57 }else 58 { 59 pTemp.next = p_1; 60 pTemp = p_1; 61 p_1 = p_1.next; 62 } 63 } 64 if(p_1 != null) 65 { 66 pTemp.next = p_1; 67 } 68 if(p_2 != null) 69 { 70 pTemp.next = p_2; 71 } 72 73 return pHead.next; 74 75 } 76 /* 77 利用遞歸的方法來進行歸並排序。 78 */ 79 public ListNode sortList(ListNode head) { 80 if(head == null || head.next == null)//遞歸結束條件 81 { 82 return head; 83 } 84 85 ListNode mid = getMidNode(head);//取得中間節點 86 ListNode pBegin = head;//中間節點左邊的(包括中間節點在內) 87 ListNode pEnd = mid.next;//中間節點右邊的。 88 mid.next = null;//這個必須設置,因為我們進行的是兩個鏈表的歸並排序 89 pBegin = sortList(pBegin);//遞歸 90 pEnd = sortList(pEnd);//遞歸 91 return mergeList(pBegin,pEnd);//兩個鏈表之間的合並操作 92 } 93 }

這道題解決起來並不難,在其中的難點就是遞歸和找中間節點,我這裏利用的是快慢指針的方法,當然你也可能有其他的方法,歡迎指正!!!

LeetCode------sort-list