leetcode每日一题-合并K个排序链表

210 阅读1分钟

题目描述

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

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

解法

  • 方法一:先将元素放到数组中排好序再放到链表中

      /**
       * Definition for singly-linked list.
       * function ListNode(val) {
       *     this.val = val;
       *     this.next = null;
       * }
       */
       
      /**
       * @param {ListNode[]} lists
       * @return {ListNode}
       */
      var mergeKLists = function(lists) {
          // 首先对特殊情况进行优先处理 1-数组内没有数据 2-数组内只有一个元素
          const len = lists.length
          if(len === 0) return []
          if(len === 1) return lists[0]
          // 正常情况下处理
          const numArr = new Array()
          for(let i = 0; i < len; i++){
              let tempNode = lists[i]
              while(tempNode){
                  numArr.push(tempNode.val)
                  tempNode = tempNode.next
              }
          }
          // 对数组进行排序
          numArr.sort((a,b) => a-b)
          // 将排好序的数组放回到链表中
          const result = new ListNode()
          const resultNode = result
          for(let i = 0 ; i < numArr.length; i++){
              const node = new ListNode(numArr[i])
              resultNode.next =  node
              resultNext = resultNode.next
          }
          return result.next
      }
    

    分析:

    • 遍历数组 O(n)
    • 排序 快速排序 O(log n)
    • 最后遍历排序数组 O(n)

    总结: 好久都没有做过算法题了,这算是这段时间做的第一道,目前懂了这种方法,后面发现/理解了更好的方法再更新,希望能一直坚持下来