Leetcode-sort-list

来源:互联网 发布:sweetalert.js 编辑:程序博客网 时间:2024/06/04 17:52

题目描述


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


链表排序,要求时间负责度为0(n log n),可以看出来我们需要利用归并排序比较好。


下面结合代码解释解题思路:


 * 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 middle = findMiddle(head);    //首先找到中间节点                ListNode right = sortList(middle.next);  //对右边子链表进行排序        middle.next = null;        ListNode left = sortList(head);          //对左边子链表进行排序                return mergeTwoLists(left, right);       //返回左右子链表的合并结果    } public static ListNode mergeTwoLists(ListNode l1, ListNode l2){    if(l1 == null)    return l2;    if(l2 == null)    return l1;    ListNode dummy = new ListNode(0);   //dummy节点用于记住头节点的上一个节点,最后需要返回头节点,用dummy.next返回    ListNode head = dummy;    while(l1 != null && l2 != null){    if(l1.val > l2.val){    head.next = l2;    l2 = l2.next;    }    else{    head.next = l1;    l1 = l1.next;    }    head = head.next;    }                                 //如果左右两边有一个子链表元素都排完了,则把另一个子链表直接插在head后头    if(l1 == null)    head.next = l2;    if(l2 == null)    head.next = l1;        return dummy.next;    }        public ListNode findMiddle(ListNode head){    //找到中间节点,定义两个指针,一个走一步a,一个走两步b,最终b指针停下来的时候,a指针刚好停在中间位置    ListNode chaser = head;    ListNode runner = head.next;    while(runner != null && runner.next != null){    chaser = chaser.next;    runner = runner.next.next;    }    return chaser;    }}


0 0