日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

sort list java leetcode_[LeetCode] 148. Sort List Java

發布時間:2024/1/23 java 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的全部內容,希望文章能夠幫你解決所遇到的問題。

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