排序連結串列 優先佇列+歸併排序
阿新 • • 發佈:2021-06-18
題目:
給你連結串列的頭結點head
,請將其按升序排列並返回排序後的連結串列。
思路:
思1 :優先佇列將連結串列資料入隊,新建一個ListNode 將資料連線起來,注意儲存頭指標進行返回
思2 :歸併排序 (遞迴拆分,將拆分後的歸併起來---666) (注意掌握)
(一)程式碼 優先佇列 時間複雜度:O(n logn) 空間複雜度:O(n)
(二)歸併方法 遞迴拆分為兩段,將兩段按順序和起來(歸併)
import java.util.PriorityQueue; //歸併 //先拆分 在合併 class Solution { public ListNode sortList(ListNode head) {//空指標判斷 if(head == null){ return head; } return splitListNode(head); } //拆分函式,運用快慢指標,當快指標的next為空時,慢指標就走到了中間的位置 public ListNode splitListNode(ListNode head){ //遞迴出口 if(head == null || head.next == null) return head; ListNode slow = head; //慢指標 ListNode fast = head; //快指標 while(fast != null && fast.next != null && fast.next.next != null){ fast = fast.next.next; //移動指標 slow = slow.next; //移動指標 } //遞迴 ListNode right = splitListNode(slow.next); slow.next= null; //注意此處,需要回歸理解 ListNode left = splitListNode(head); return merge(left,right); } //合併連結串列函式 public ListNode merge(ListNode left,ListNode right){ ListNode listNode = new ListNode(0); ListNode resNode = listNode; //定義返回的頭結點 while(left != null && right != null){ if(left.val <= right.val){ listNode.next = left; left = left.next; }else{ listNode.next = right; right = right.next; } listNode = listNode.next; } if(left != null) listNode.next = left; if(right != null) listNode.next = right; return resNode.next; } }
入市賭一把,單車 或 摩托 ?