diff --git a/problems/merge-k-sorted-lists/README.md b/problems/merge-k-sorted-lists/README.md index 28fc7a4fc..2f4e64b81 100644 --- a/problems/merge-k-sorted-lists/README.md +++ b/problems/merge-k-sorted-lists/README.md @@ -26,9 +26,9 @@ ### Related Topics - [[Heap](../../tag/heap/README.md)] [[Linked List](../../tag/linked-list/README.md)] [[Divide and Conquer](../../tag/divide-and-conquer/README.md)] + [[Heap](../../tag/heap/README.md)] ### Similar Questions 1. [Merge Two Sorted Lists](../merge-two-sorted-lists) (Easy) diff --git a/problems/merge-k-sorted-lists/merge_k_sorted_lists.go b/problems/merge-k-sorted-lists/merge_k_sorted_lists.go index c69fad2c0..25d1dc230 100644 --- a/problems/merge-k-sorted-lists/merge_k_sorted_lists.go +++ b/problems/merge-k-sorted-lists/merge_k_sorted_lists.go @@ -1 +1,34 @@ package problem23 + +import "github.com/openset/leetcode/internal/kit" + +// ListNode - Definition for singly-linked list. +type ListNode = kit.ListNode + +/** + * Definition for singly-linked list. + * type ListNode struct { + * Val int + * Next *ListNode + * } + */ +func mergeKLists(lists []*ListNode) *ListNode { + var ans *ListNode + for _, l := range lists { + ans = mergeTwoLists(ans, l) + } + return ans +} + +func mergeTwoLists(l1 *ListNode, l2 *ListNode) *ListNode { + if l1 == nil { + return l2 + } else if l2 == nil { + return l1 + } + if l1.Val > l2.Val { + l1, l2 = l2, l1 + } + l1.Next = mergeTwoLists(l1.Next, l2) + return l1 +} diff --git a/problems/merge-k-sorted-lists/merge_k_sorted_lists_test.go b/problems/merge-k-sorted-lists/merge_k_sorted_lists_test.go index c69fad2c0..47f574d2b 100644 --- a/problems/merge-k-sorted-lists/merge_k_sorted_lists_test.go +++ b/problems/merge-k-sorted-lists/merge_k_sorted_lists_test.go @@ -1 +1,51 @@ package problem23 + +import ( + "reflect" + "testing" + + "github.com/openset/leetcode/internal/kit" +) + +type testType struct { + in [][]int + want []int +} + +func TestMergeKLists(t *testing.T) { + tests := [...]testType{ + { + in: [][]int{ + {1, 4, 5}, + {1, 3, 4}, + {2, 6}, + }, + want: []int{1, 1, 2, 3, 4, 4, 5, 6}, + }, + { + in: [][]int{ + {2}, + {}, + {-1}, + }, + want: []int{-1, 2}, + }, + { + in: [][]int{ + {}, + {}, + }, + want: nil, + }, + } + for _, tt := range tests { + lists := make([]*ListNode, len(tt.in)) + for i, v := range tt.in { + lists[i] = kit.SliceInt2ListNode(v) + } + got := kit.ListNode2SliceInt(mergeKLists(lists)) + if !reflect.DeepEqual(got, tt.want) { + t.Fatalf("in: %v, got: %v, want: %v", tt.in, got, tt.want) + } + } +}