zoukankan      html  css  js  c++  java
  • 剑指 Offer 25. 合并两个排序的链表及扩展

    剑指 Offer 25. 合并两个排序的链表

    输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。

    示例1:

    输入:1->2->4, 1->3->4
    输出:1->1->2->3->4->4
    限制:

    0 <= 链表长度 <= 1000

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/he-bing-liang-ge-pai-xu-de-lian-biao-lcof

    递归

    /**
     * Definition for singly-linked list.
     * function ListNode(val) {
     *     this.val = val;
     *     this.next = null;
     * }
     */
    /**
     * @param {ListNode} l1
     * @param {ListNode} l2
     * @return {ListNode}
     */
    const mergeTwoLists=function(l1,l2){
        if(l1==null){
            return l2;
        }
        if(l2==null){
            return l1;
        }
        if(l1.val<l2.val){
            l1.next=mergeTwoLists(l1.next,l2);
            return l1;
        }else{
            l2.next=mergeTwoLists(l1,l2.next);
            return l2;
        }
    };

    面试题 10.01. 合并排序的数组

    给定两个排序后的数组 A 和 B,其中 A 的末端有足够的缓冲空间容纳 B。 编写一个方法,将 B 合并入 A 并排序。

    初始化 A 和 B 的元素数量分别为 m 和 n。

    示例:

    输入:
    A = [1,2,3,0,0,0], m = 3
    B = [2,5,6], n = 3

    输出: [1,2,2,3,5,6]
    说明:

    A.length == n + m

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/sorted-merge-lcci

    看起来比较相似,然而想一下应该是用到双指针的

    这里我们从两个数组的末尾开始扫描

    class Solution:
        def merge(self, A: List[int], m: int, B: List[int], n: int) -> None:
            """
            Do not return anything, modify A in-place instead.
            """
            i,j=m-1,n-1
            cur=m+n-1
            while i>=0 and j>=0:
                if A[i]<B[j]:
                    A[cur]=B[j]
                    j-=1
                else:
                    A[cur]=A[i]
                    i-=1
                cur-=1
            if j!=-1:#如果B没扫完,直接丢到A前面
                A[:j+1]=B[:j+1]
            return A   

     

    88. 合并两个有序数组

    给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。

    说明:

    初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。
    你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。
     

    示例:

    输入:
    nums1 = [1,2,3,0,0,0], m = 3
    nums2 = [2,5,6], n = 3

    输出: [1,2,2,3,5,6]

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/merge-sorted-array

    同理

    class Solution:
        def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
            while m>0 and n >0:
                if nums1[m-1]<=nums2[n-1]:
                    nums1[m+n-1]=nums2[n-1]
                    n-=1
                else:
                    nums1[m+n-1]=nums1[m-1]
                    m-=1
            if n>0:
                nums1[:n]=nums2[:n]

    56. 合并区间

    给出一个区间的集合,请合并所有重叠的区间。

    示例 1:

    输入: [[1,3],[2,6],[8,10],[15,18]]
    输出: [[1,6],[8,10],[15,18]]
    解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].
    示例 2:

    输入: [[1,4],[4,5]]
    输出: [[1,5]]
    解释: 区间 [1,4] 和 [4,5] 可被视为重叠区间。

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

    主要是排序

    class Solution:
        def merge(self, intervals: List[List[int]]) -> List[List[int]]:
            if len(intervals)<=1:
                return intervals
            def get_first(l):
                return l[0]
            intervals.sort(key=get_first)
            res=[intervals[0]]
            for i in range(1,len(intervals)):
                if intervals[i][0]<=res[-1][1]:
                    res[-1]=[res[-1][0],max(intervals[i][1],res[-1][1])]
                else:
                    res.append(intervals[i])
            return res

     

    23. 合并K个排序链表

    合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。

    示例:

    输入:
    [
      1->4->5,
      1->3->4,
      2->6
    ]
    输出: 1->1->2->3->4->4->5->6

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/merge-k-sorted-lists

    终于来到进阶版本了,这道题说是hard,其实就是从归并排序(merge sort)演化来的,再+分治的思想

    # Definition for singly-linked list.
    # class ListNode:
    #     def __init__(self, x):
    #         self.val = x
    #         self.next = None
    
    class Solution:
        def mergeKLists(self, lists: List[ListNode]) -> ListNode:
            n=len(lists)
            
            #pre-operation
            if n==0:return None
            if n==1:return lists[0]
            if n==2:return self.mergeTwoLists(lists[0],lists[1])
            
            #divid and conquer
            mid=n//2
            return self.mergeTwoLists(self.mergeKLists(lists[:mid]),self.mergeKLists(lists[mid:n]))
    
        def mergeTwoLists(self,l1:ListNode,l2:ListNode)->ListNode:
            res=ListNode(0)
            q1,q2,q3=l1,l2,res
            while q1 or q2:
                if q1 and q2:
                    if q1.val<q2.val:
                        q3.next=ListNode(q1.val)
                        q1=q1.next
                    else:
                        q3.next=ListNode(q2.val)
                        q2=q2.next
                    q3=q3.next
                elif q1:
                    q3.next=q1
                    break
                else:
                    q3.next=q2
                    break
                
            return res.next

     

     

     
  • 相关阅读:
    【BZOJ3028】食物(生成函数基础题)
    【BZOJ2438】[中山市选2011] 杀人游戏(Tarjan)
    【BZOJ4833】[Lydsy1704月赛] 最小公倍佩尔数(神仙数学题)
    【BZOJ2109】【BZOJ2535】[NOI2010] 航空管制(拓扑反向建图)
    【BZOJ2679】[USACO2012 Open] Balanced Cow Subsets(Meet in Middle)
    【BZOJ3091】城市旅行(再次重拾LCT)
    sass与compass实战
    【Sass初级】开始使用Sass和Compass
    nodejs、sass、backbone等api地址
    解读2015之前端篇:工业时代 野蛮发展(转)
  • 原文地址:https://www.cnblogs.com/xxxsans/p/13380727.html
Copyright © 2011-2022 走看看