leetcode_合并K个升序链表

51 阅读1分钟

给你一个链表数组,每个链表都已经按升序排列。

请你将所有链表合并到一个升序链表中,返回合并后的链表。

示例 1:

输入: lists = [[1,4,5],[1,3,4],[2,6]]
输出: [1,1,2,3,4,4,5,6]
解释:链表数组如下:
[
  1->4->5,
  1->3->4,
  2->6
]
将它们合并到一个有序链表中得到。
1->1->2->3->4->4->5->6

示例 2:

输入: lists = []
输出: []

示例 3:

输入: lists = [[]]
输出: []
package mergeKLists

type ListNode struct {
   Val  int
   Next *ListNode
}

func mergeKLists(lists []*ListNode) *ListNode {
   if len(lists) == 0 {
      return nil
   }

   for len(lists) > 1 {
      //去除最开始的两项
      item1 := lists[0]
      item2 := lists[1]
      lists = lists[2:]
      //先两两合并
      mergedLists := mergeTwoLists(item1, item2)
      //合并完把合并结果加入到数组中
      lists = append(lists, mergedLists)
   }
   return lists[0]
}

func mergeTwoLists(list1 *ListNode, list2 *ListNode) *ListNode {
   var preHead = new(ListNode)
   var ret = preHead
   for list1 != nil && list2 != nil {
      if list1.Val < list2.Val {
         preHead.Next = list1
         list1 = list1.Next
      } else {
         preHead.Next = list2
         list2 = list2.Next
      }
      preHead = preHead.Next
   }
   if list1 != nil {
      preHead.Next = list1
   }
   if list2 != nil {
      preHead.Next = list2
   }
   return ret.Next
}