zoukankan      html  css  js  c++  java
  • 排序链表

    题目描述:

    给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。

    要求:你可以在 O(n log n) 时间复杂度和常数级空间复杂度

    示例:

    输入:head = [4,2,1,3] 输出:[1,2,3,4] 示例 2:

    输入:head = [-1,5,3,4,0] 输出:[-1,0,3,4,5] 示例 3:

    输入:head = [] 输出:[]

    思路:

    这道题可以使用递归解法。「切割链表」和「排序合并」

    代码:

    //go
    func sortList(head *ListNode) *ListNode {
        // 1、递归结束条件
        if head == nil || head.Next == nil {
            return head
        }
    
        // 2、找到链表中间节点并断开链表 & 递归下探
        midNode := middleNode(head)
        rightHead := midNode.Next
        midNode.Next = nil
    
        left := sortList(head)
        right := sortList(rightHead)
    
        // 3、合并有序链表
        return mergeList(left, right)
    
    }
    
    // 找到链表中间节点(876. 链表的中间结点)
    func middleNode(head *ListNode) *ListNode {
        if head == nil || head.Next == nil {
            return head
        }
    
        slow, fast := head, head.Next.Next
        for fast != nil && fast.Next != nil {
            slow = slow.Next
            fast = fast.Next.Next
        }
        return slow
    }
    
    // 合并两个有序链表(21. 合并两个有序链表)
    func mergeList(l1, l2 *ListNode) *ListNode {
        // 预处理
        if l1 == nil {
            return l2
        }
        if l2 == nil {
            return l1
        }
    
        // 虚拟头结点
        dummyHead := &ListNode{}
        cur := dummyHead
        for l1 != nil && l2 != nil {
            if l1.Val < l2.Val {
                cur.Next = l1
                cur = cur.Next
                l1 = l1.Next
            }else {
                cur.Next = l2
                cur = cur.Next
                l2 = l2.Next
            }
        }
        // 任一为空,直接连接另一条链表
        if l1 == nil {
            cur.Next = l2
        }
        if l2 == nil {
            cur.Next = l1
        }
        return dummyHead.Next
    }
    

      地址:https://mp.weixin.qq.com/s/Sb8rs3iS8lAkMheMR_-owQ

    small_lei_it 技术无止境,追求更高。
  • 相关阅读:
    window下配置ssh key
    Mysqldump记录
    WordPress插件入口菜单创建的位置代码
    阿里大鱼发送短信使用记录
    SpringMVC–SSH -- RESTful -- JSR303
    Spring MVC程序中得到静态资源文件css,js,图片
    包机项目源码分析笔记
    myeclipse中java文件头注释格式设置
    oracle扩展dblink数。
    linux--解决oracle sqlplus 中上下左右backspace不能用
  • 原文地址:https://www.cnblogs.com/smallleiit/p/13930635.html
Copyright © 2011-2022 走看看