1. 程式人生 > 其它 >排序連結串列 優先佇列+歸併排序

排序連結串列 優先佇列+歸併排序

題目:

  給你連結串列的頭結點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; } }

  


      入市賭一把,單車 或 摩托 ?