美文网首页
归并的思想解决链表排序、多个链表合并问题

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

作者: 某非著名程序员 | 来源:发表于2020-11-12 14:06 被阅读0次

1. 23.合并多个有序链表

与归并排序思想一致,两两合并。

func mergeKLists(_ lists: [ListNode?]) -> ListNode? {
        if lists.count == 0 {
            return nil
        }
        return dfsMerge(lists, 0, lists.count-1)
    }
    
    func dfsMerge(_ lists: [ListNode?],_ start:Int,_ end:Int) -> ListNode? {
        if start == end {
            return lists[start]
        }
        let mid = (start+end)>>1
        let h1 = dfsMerge(lists, start, mid)
        let h2 = dfsMerge(lists, mid+1, end)
        
        return mergeTwoLists(h1, h2)
    }
    
    func mergeTwoLists(_ h1:ListNode?,_ h2:ListNode?) -> ListNode?{
        let h = ListNode.init(0)
        var tail:ListNode? = h
        
        var cur1 = h1
        var cur2 = h2
        
        while cur1 != nil && cur2 != nil {
            if cur1!.val<=cur2!.val {
                tail?.next = cur1
                tail = cur1
                cur1 = cur1?.next
            }else{
                tail?.next = cur2
                tail = cur2
                cur2 = cur2?.next
            }
        }
        
        var cur = cur1 != nil ?cur1:cur2
        while cur != nil {
            tail?.next = cur
            tail = cur
            cur = cur?.next
        }
        
        return h.next
    }

2. 148. 排序链表

思路:与归并思想一致

  1. 快慢指针查找中点
  2. 分别递归,然后合并
func sortList(_ head: ListNode?) -> ListNode? {
        if head == nil {
            return nil
        }
        return dfsSortList(head)
    }
    
    func dfsSortList(_ head:ListNode?) -> ListNode? {
        if head?.next == nil {//递归条件
            return head
        }
        let mid = findMid(head)
        let next = mid?.next
        mid?.next = nil
        
        let l = dfsSortList(head)
        let r = dfsSortList(next)
        return mergeSortList(l,r)
    }
    
    func mergeSortList(_ h1: ListNode?,_ h2: ListNode?) -> ListNode? {
        let newHead:ListNode = ListNode.init(-1)
        var tail = newHead
        
        var cur1 = h1
        var cur2 = h2
        var next1 = cur1?.next
        var next2 = cur2?.next
        
        while cur1 != nil && cur2 != nil {
            if cur1!.val <= cur2!.val{
                tail.next = cur1
                tail = cur1!
                
                cur1 = next1
                next1 = cur1?.next
            }else{
                tail.next = cur2
                tail = cur2!
                
                cur2 = next2
                next2 = cur2?.next
            }
        }
        
        var cur = cur1 != nil ?cur1:cur2
        while cur != nil {
            tail.next = cur
            tail = cur!
            cur = cur?.next
        }
        
        return newHead.next
    }
    
    func findMid(_ head:ListNode?) -> ListNode? {
        var slow = head
        var fast = head?.next
        
        while fast != nil && fast?.next != nil{
            slow = slow?.next
            fast = fast?.next?.next
        }
        
        return slow
    }

相关文章

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

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

  • LeetCode 专题 :分治算法

    LeetCode 第 23 题:归并多个有序链表 传送门:23. 合并K个排序链表。 合并 k 个排序链表,返回合...

  • 23. Merge k Sorted Lists

    题目描述:将k个已排序的链表合并为一条排好序的链表。分析复杂度。分析:k个链表的归并可以利用归并排序的思想,每次取...

  • 2018-12-26

    问题列表 合并两个有序链表 合并K个排序链表 合并区间 插入区间 问题与反馈 总结与收获 多个有序链表的合并,类似...

  • 一刷到底。。

    归并快排堆排序模拟堆01背包完全背包问题多重背包问题多重背包问题2链表排序多链表合并字符串哈希字典树单调栈单调队列...

  • leecode刷题(27)-- 合并k个排序链表

    leecode刷题(27)-- 合并k个排序链表 合并k个排序链表 合并 k 个排序链表,返回合并后的排序链表。请...

  • Leetcode系列之链表(13)

    题目: 合并k个已排序的链表并将其作为一个已排序的链表返回。分析并描述其复杂度。 思路: 典型的多路归并问题 代码...

  • Swift - LeetCode - 合并K个排序链表

    题目 合并K个排序链表 问题: 合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。 解题思路:...

  • 23、Merge k Sorted Lists

    题设 要点 链表合并 迭代 归并排序 对已经有序的k个链表进行合并,有两种思路: 1、对lists中的每2个链表进...

  • python链表归并排序

    利用归并排序的思想,使用o(nlogn)时间复杂度,排序链表

网友评论

      本文标题:归并的思想解决链表排序、多个链表合并问题

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