leetcode

    xiaoxiao2023-10-25  105

    题目:

     Sort a linked list in O(n log n) time using constant space complexity.

    关键字:链表排序+稳定算法+时间复杂度最低


     思路:稳定+算法复杂度的(限定 O(n log n))只有归并排序

    https://blog.csdn.net/u012429555/article/details/89433932


    /** * Definition for singly-linked list. * class ListNode { * int val; * ListNode next; * ListNode(int x) { * val = x; * next = null; * } * } */ public class Solution { public ListNode sortList(ListNode head) { if(head == null || head.next == null) { return head; } ListNode mid = getMid(head); ListNode midNext = mid.next; mid.next = null; return mergeSort(sortList(head), sortList(midNext)); } //求得中间节点 /** * 获取连接的中间,两个指针,一个走一步,一个走两步,两步走完时,慢指针刚好到了中间的部分 * @param head * @return */ private ListNode getMid(ListNode head) { if(head == null || head.next == null) { return head; } ListNode slow = head, quick = head; while(quick.next != null && quick.next.next != null) { slow = slow.next; quick = quick.next.next; } return slow; } /** * 合并两个链表 * @param sortList * @param sortList2 * @return */ private ListNode mergeSort(ListNode n1, ListNode n2) { ListNode preHead = new ListNode(0), cur1 = n1, cur2 = n2, cur = preHead; while(cur1 != null && cur2 != null) { if(cur1.val < cur2.val) { cur.next = cur1; cur1 = cur1.next; } else { cur.next = cur2; cur2 = cur2.next; } cur = cur.next; } cur.next = cur1 == null ? cur2 : cur1; return preHead.next; } }

     

    最新回复(0)