Skip to content

Commit

Permalink
[LinkedList] add solution to MergeKSortedLists
Browse files Browse the repository at this point in the history
  • Loading branch information
Yi Gu committed May 11, 2016
1 parent f9c5af2 commit 19a2fc6
Showing 1 changed file with 68 additions and 0 deletions.
68 changes: 68 additions & 0 deletions LinkedList/MergeKSortedLists.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
/**
* Question Link: https://leetcode.com/problems/merge-k-sorted-lists/
* Primary idea: Divide and Conqure with merge two sorted lists as a helper function
* Time Complexity: O(mlogn), m stands for the length of one list, n stands for the number of lists
* Space Complexity: O(1)
*
* Definition for singly-linked list.
* public class ListNode {
* public var val: Int
* public var next: ListNode?
* public init(_ val: Int) {
* self.val = val
* self.next = nil
* }
* }
*/

class MergeKSortedLists {
func mergeKLists(lists: [ListNode?]) -> ListNode? {
guard lists.count > 0 else {
return nil
}

var left = 0
var right = lists.count - 1

var lists = lists

while right > 0 {
left = 0
while left < right {
lists[left] = _mergeTwoLists(lists[left], lists[right])
left += 1
right -= 1
}
}

return lists[0]
}

private func _mergeTwoLists(l1: ListNode?, _ l2: ListNode?) -> ListNode? {
let dummy = ListNode(0)
var node = dummy

var l1 = l1
var l2 = l2

while l1 != nil && l2 != nil {
if l1!.val < l2!.val {
node.next = l1
l1 = l1!.next
} else {
node.next = l2
l2 = l2!.next
}

node = node.next!
}

if l1 != nil {
node.next = l1
} else {
node.next = l2
}

return dummy.next
}
}

0 comments on commit 19a2fc6

Please sign in to comment.