美文网首页
148. 排序链表

148. 排序链表

作者: 周英杰Anita | 来源:发表于2020-01-10 16:55 被阅读0次

题目描述:

在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序。

示例 1:

输入: 4->2->1->3
输出: 1->2->3->4

示例 2:

输入: -1->5->3->4->0
输出: -1->0->3->4->5

思路:

题目要求在 O(n log n) 时间复杂度下解题,在满足这个时间复杂度的常见算法有快速排序,归并排序,和堆排序。归并排序的重点是找到中间节点。

Java解法之冒泡排序(不满足题目对于时间复杂度的要求):

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode sortList(ListNode head) {
        ListNode indexNode = head;
        ListNode startNode = head;
        if(head == null) return head;
        while(indexNode.next != null)
        {
            boolean exchangeflag = true;
            head = startNode;
            while(head.next != null){
                if(head.val > head.next.val)
                {
                    int temp = head.val;
                    head.val = head.next.val;
                    head.next.val = temp;
                    exchangeflag = false;
                }
                head = head.next;
            }
            if(exchangeflag)
            {
                break;
            }else{
                indexNode = indexNode.next;
            }  
        }
        return startNode;
    }
}

Java解法之归并排序:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode sortList(ListNode head) {
        if(head == null || head.next ==null) return head;
        ListNode slow = head, fast = head.next;
        while (fast != null && fast.next != null) {
            slow = slow.next;
            fast = fast.next.next;
        }
        ListNode temp = slow.next;
        slow.next = null;
        ListNode left = sortList(head);
        ListNode right = sortList(temp);
        ListNode h = new ListNode(0);
        ListNode ans = h;
        while(left != null && right != null)
        {
            if(left.val < right.val)
            {
                h.next = left;
                left = left.next;
            }else{
                h.next = right;
                right = right.next;
            }
            h = h.next;
        }
        h.next = left != null ? left : right;
        return ans.next;
    }
}

[图解] 归并排序

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sort-list

相关文章

  • 链表续

    148. 排序链表

  • 148. 排序链表

    148. 排序链表

  • LeetCode-148-排序链表

    LeetCode-148-排序链表 148. 排序链表[https://leetcode-cn.com/probl...

  • 148 排序链表

    148. 排序链表要求:时间复杂度 O(NlogN), 空间O(1)采用归并排序我们使用快慢指针 来定位单链表中间的位置

  • 链表排序问题

    148. Sort List(链表归并排序)Sort a linked list in O(n log n) ti...

  • [LeetCode] 148. 排序链表

    148. 排序链表在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序。示例:输入: 4->2...

  • python实现leetcode之148. 排序链表

    解题思路 计算长度找到中点一分为二,分开排序然后归并 148. 排序链表[https://leetcode-cn....

  • 归并的思想解决链表排序、多个链表合并问题

    1. 23.合并多个有序链表 与归并排序思想一致,两两合并。 2. 148. 排序链表 思路:与归并思想一致 快慢...

  • 148. 排序链表

    在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序。 示例 1: 输入: 4->2->1->...

  • 148. 排序链表

    先使用快慢指针将找到链表的中点,然后将链表切分成左右两部分,然后对左右指针递归进行排序,最后归并两个已经排序的链表...

网友评论

      本文标题:148. 排序链表

      本文链接:https://www.haomeiwen.com/subject/eappactx.html