diff --git a/README.md b/README.md index 2d61bdb..068c949 100644 --- a/README.md +++ b/README.md @@ -76,6 +76,7 @@ continually updating 😃. * [83. Remove Duplicates from Sorted List](src/0083_remove_duplicates_from_sorted_list/rdfsl.go) * [86. Partition List](src/0086_partition_list/partition_list.go)   *`two pointers`* * [92. Reverse Linked List II](src/0092_reverse_linked_list_2/reverse_linked_list2.go) +* [148. Sort List](src/148_Sort_List/sortlist.go)   *`sort`* * [203. Remove Linked List Elements](src/0203_remove_linked_list_elements/remove_linked_list_elements.go) * [206. Reverse Linked List](src/0206_reverse_linked_list/reverse_linked_list.go) * [237. Delete Node in a Linked List](src/0237_delete_node_in_a_linked_list/dniall.go) diff --git a/src/148_Sort_List/sortlist.go b/src/148_Sort_List/sortlist.go new file mode 100644 index 0000000..d10a670 --- /dev/null +++ b/src/148_Sort_List/sortlist.go @@ -0,0 +1,53 @@ +/* +148. Sort List +https://leetcode.com/problems/sort-list/ +*/ +// time: 2019-03-04 + +package sortlist + +// ListNode Definition for singly-linked list. +type ListNode struct { + Val int + Next *ListNode +} + +// merge sort +// time complexity: O(n * log(n)) +// using recursion, the system stack is used. +func sortList(head *ListNode) *ListNode { + if head == nil || head.Next == nil { + return head + } + + prev, slow, fast := head, head, head + for fast != nil && fast.Next != nil { + prev = slow + slow = slow.Next + fast = fast.Next.Next + } + prev.Next = nil + return merge(sortList(head), sortList(slow)) +} + +func merge(headA, headB *ListNode) *ListNode { + dummy := &ListNode{} + tail := dummy + + for headA != nil && headB != nil { + if headA.Val > headB.Val { + tail.Next = headB + headB = headB.Next + } else { + tail.Next = headA + headA = headA.Next + } + tail = tail.Next + } + if headA != nil { + tail.Next = headA + } else { + tail.Next = headB + } + return dummy.Next +} diff --git a/src/148_Sort_List/sortlist_test.go b/src/148_Sort_List/sortlist_test.go new file mode 100644 index 0000000..7169ce0 --- /dev/null +++ b/src/148_Sort_List/sortlist_test.go @@ -0,0 +1,24 @@ +package sortlist + +import ( + "reflect" + "testing" +) + +func TestSortList(t *testing.T) { + head := createSingleLinkedList([]int{-1, 5, 3, 4, 0}) + expected := createSingleLinkedList([]int{-1, 0, 3, 4, 5}) + if res := sortList(head); !reflect.DeepEqual(res, expected) { + t.Errorf("expected %v, got %v", expected, res) + } +} + +func createSingleLinkedList(nums []int) *ListNode { + dummy := ListNode{} + cur := &dummy + for _, val := range nums { + cur.Next = &ListNode{Val: val} + cur = cur.Next + } + return dummy.Next +} diff --git a/src/README.md b/src/README.md index b506f5a..5066260 100644 --- a/src/README.md +++ b/src/README.md @@ -60,6 +60,7 @@ |0125|[Valid Palindrome](0125_valid_palindrome/valid_palindrome.go)|Easy|| |0136|[136. Single Number](0136_single_number/single_number.go)|Easy|*`hash table;`* *`bit manipulation`*| |0144|[144. Binary Tree Preorder Traversal](0144_binary_tree_preorder_traversal/binary_tree_preorder_traversal.go)|Medium|*`binary tree`*| +|0148|[148. Sort List](148_Sort_List/sortlist.go)|Medium|*`sort;`* *`linked list`*| |0150|[150. Evaluate Reverse Polish Notation](0150_evaluate_reverse_polish_notation/evaluate_reverse_polish_notation.go)|Medium|*`stack`*| |0153|[153. Find Minimum in Rotated Sorted Array](0153_find_minimum_in_rotated_sorted_array/fmirsa.go)|Medium|*`binary search`*| |0155|[155. Min Stack](0155_min_stack/min_stack.go)|Easy|*`stack`*|