sort list java leetcode_[LeetCode] 148. Sort List Java
題目:Sort a linked list inO(n?log?n) time using constant space complexity.
題意及分析:要求使用o(nlogn)的時間復雜度和o(1)的空間復雜度將鏈表排序。o(nlogn)的排序算法有快速排序,歸并排序和堆排序。但是快速排序最差情況下時間復雜度為o(n^2),所以不考慮,堆排序比較復雜,因此我這里使用歸并排序。對于一個數組來說,歸并排序主要是講數組從中間分割成兩部分,然后對左右子數組做同樣操作,直至每個子數組都只有一個元素,然后兩兩合并。因為這里是鏈表,所以怎么找到中間分割點比較關鍵,這里使用兩個指針slow,fast,slow每次移動一步,fast每次移動兩步,當fast到鏈表尾時,slow所在位置就是鏈表中。我這里使用的是遞歸的方法求解。對于鏈表來說,非遞歸算法效率更高,所以合并處可以使用非遞歸算法,這樣會快很多。
代碼:
遞歸:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
public class Solution {
public ListNode sortList(ListNode head) {
if(head==null||head.next==null) return head;
ListNode slow=head;
ListNode fast=head;
ListNode p=head;
while(fast!=null&&fast.next!=null){//slow每次走一步,fast每次走兩步,當fast走到最后時,slow走到鏈表的中間,這樣就可以將鏈表分成兩半
p=slow;
slow=slow.next;
fast=fast.next.next;
}
p.next=null;//將前半段鏈表設置為null結尾,這樣鏈表就被分成(head,p),(slow,fast)
ListNode h1=sortList(head);
ListNode h2=sortList(slow);
return mergeList(h1, h2);
}
public ListNode mergeList(ListNode h1,ListNode h2){//合并兩個鏈表
if(h1==null) return h2;
if(h2==null) return h1;
if(h1.val
h1.next=mergeList(h1.next, h2);
return h1;
}else{
h2.next=mergeList(h1, h2.next);
return h2;
}
}
}
非遞歸:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
public class Solution {
public ListNode sortList(ListNode head) {
if(head==null||head.next==null) return head;
ListNode slow=head;
ListNode fast=head;
ListNode p=head;
while(fast!=null&&fast.next!=null){//slow每次走一步,fast每次走兩步,當fast走到最后時,slow走到鏈表的中間,這樣就可以將鏈表分成兩半
p=slow;
slow=slow.next;
fast=fast.next.next;
}
p.next=null;//將前半段鏈表設置為null結尾,這樣鏈表就被分成(head,p),(slow,fast)
ListNode h1=sortList(head);
ListNode h2=sortList(slow);
return mergeList(h1, h2);
}
public ListNode mergeList(ListNode h1,ListNode h2){//合并兩個鏈表
if(h1==null) return h2;
if(h2==null) return h1;
ListNode res = new ListNode(0);//結果鏈表
ListNode x=res;
while(h1!=null&&h2!=null){
if(h1.val
x.next=h1;
h1=h1.next;
x=x.next;
}else{
x.next=h2;
h2=h2.next;
x=x.next;
}
}
if(h1!=null)
x.next=h1;
if(h2!=null)
x.next=h2;
return res.next;
}
}
總結
以上是生活随笔為你收集整理的sort list java leetcode_[LeetCode] 148. Sort List Java的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 成都两年JAVA工程师_成都Java工程
- 下一篇: Java接受带文件的表单_Javaweb