医院网站怎么做,南宁制作网站企业,wordpress 小说 批量,暴利灰色偏门项目Problem: 148. 排序链表
思路
这是一个链表排序的问题#xff0c;由于要求时间复杂度为 O(nlogn)#xff0c;适合使用归并排序#xff08;Merge Sort#xff09;来解决。
解题方法
首先#xff0c;使用快慢指针找到链表的中间节点#xff0c;将链表分成两部分。然后由于要求时间复杂度为 O(nlogn)适合使用归并排序Merge Sort来解决。
解题方法
首先使用快慢指针找到链表的中间节点将链表分成两部分。然后递归地对两个子链表进行排序。最后合并两个有序的子链表。
复杂度
时间复杂度: O(nlogn) 空间复杂度: O(logn)递归调用栈的深度
Code
/*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val val; }* ListNode(int val, ListNode next) { this.val val; this.next next; }* }*/
class Solution {public ListNode sortList(ListNode head) {if(head null || head.next null) {return head;}ListNode slow head;ListNode fast head;while(fast.next ! null fast.next.next ! null) {slow slow.next;fast fast.next.next;}ListNode mid slow.next;slow.next null;ListNode left sortList(head);ListNode right sortList(mid);return mergeList(left, right);}private ListNode mergeList(ListNode left, ListNode right) {ListNode dummyHead new ListNode(-1);ListNode cur dummyHead;while(left ! null right ! null) {if(left.val right.val) {cur.next left;left left.next;}else{cur.next right;right right.next;}cur cur.next;}if(left null) {cur.next right;}if(right null) {cur.next left;}return dummyHead.next;}
}