题目:
给你链表的头结点 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; } }
入市赌一把,单车 或 摩托 ?