美文网首页
148. 排序链表

148. 排序链表

作者: one_zheng | 来源:发表于2018-10-03 19:29 被阅读35次

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

示例 1:

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

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

思路:时间复杂度的排序算法有归并排序、堆排序、快速排序等,使用归并排序来解答。

package leetcode

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

//示例 1:

//输入: 4->2->1->3
//输出: 1->2->3->4
//示例 2:

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

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func sortList(head *ListNode) *ListNode {
    if head == nil || head.Next == nil {
        return head
    }
    // 找出中点链表一分为二
    p1 := head
    p2 := head.Next

    for {
        if p2 == nil {
            break
        }
        p2 = p2.Next
        if p2 == nil {
            break
        }
        p2 = p2.Next
        p1 = p1.Next
    }
    p2 = p1.Next
    p1.Next = nil
    p1 = head
    // 排序左边
    p1 = sortList(p1)
    // 排序右边
    p2 = sortList(p2)
    // 合并
    p1 = mergeTwoLists(p1, p2)
    return p1
}

func mergeTwoLists(left, right *ListNode) *ListNode {
    if left == nil {
        return right
    }
    if right == nil {
        return left
    }
    if left.Val <= right.Val {
        left.Next = mergeTwoLists(left.Next, right)
        return left
    } else {
        right.Next = mergeTwoLists(left, right.Next)
        return right
    }
}

相关文章

  • 链表续

    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/wpctaftx.html