# Week3 - Sorting
###### tags: `Leetcode`
## 56. Merge Intervals
```python
class Solution:
def merge(self, intervals: List[List[int]]) -> List[List[int]]:
res = []
intervals.sort(key=lambda x: x[0])
left, right = intervals[0]
for interval in intervals:
if interval[0] > right:
res.append([left, right])
left, right = interval
elif interval[1] > right:
right = interval[1]
res.append([left, right])
return res
```
## 75. Sort Colors
```python
class Solution:
def sortColors(self, nums: List[int]) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
nums.sort()
```
## 88. Merge Sorted Array
```python
class Solution:
def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
"""
Do not return anything, modify nums1 in-place instead.
"""
temp = nums1[:m]
i, j, k = 0, 0, 0
while i < m and j < n:
if temp[i] > nums2[j]:
nums1[k] = nums2[j]
j += 1
k += 1
else:
nums1[k] = temp[i]
i += 1
k += 1
while i < m:
nums1[k] = temp[i]
i += 1
k += 1
while j < n:
nums1[k] = nums2[j]
j += 1
k += 1
```
```python
class Solution:
def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
"""
Do not return anything, modify nums1 in-place instead.
"""
p1 = m+n-1
# Reverse order
while m > 0 and n > 0:
if nums1[m-1] > nums2[n-1]:
nums1[p1] = nums1[m-1]
m -= 1
else:
nums1[p1] = nums2[n-1]
n -= 1
p1 -= 1
# Edge case: fill nums1 with leftover nums2 elements
while n > 0:
nums1[p1] = nums2[n-1]
p1, n = p1-1, n-1
```
## 49. Group Anagrams
```python
from collections import defaultdict
class Solution:
def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
dic = defaultdict(list)
for s in strs:
dic[''.join(sorted(s))].append(s)
return dic.values()
```
## 148. Sort List
```python
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def sortList(self, head: Optional[ListNode]) -> Optional[ListNode]:
a_list = []
origin = head
while head is not None:
a_list.append(head.val)
head = head.next
a_list.sort()
head = origin
for ele in a_list:
head.val = ele
head = head.next
return origin
```
```python
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def sortList(self, head: Optional[ListNode]) -> Optional[ListNode]:
if not head or not head.next:
return head
# split the list into two halfs:
left = head
right = self.getMid(head)
tmp = right.next
right.next = None
right = tmp
left = self.sortList(left)
right = self.sortList(right)
return self.merge(left, right)
def getMid(self,head):
slow, fast = head, head.next
while fast and fast.next:
slow = slow.next
fast = fast.next.next
return slow
def merge(self, left, right):
tail = dummy = ListNode()
while left and right:
if left.val < right.val:
tail.next = left
left = left.next
else:
tail.next = right
right = right.next
tail = tail.next
if left:
tail.next = left
if right:
tail.next = right
return dummy.next
```
## 147. Insertion Sort List
```python
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def insertionSortList(self, head: Optional[ListNode]) -> Optional[ListNode]:
root = ListNode(0)
root.next = head
while head.next:
if head.val <= head.next.val:
head = head.next
else:
tmp = head.next
q = root
head.next = head.next.next
while True:
if q.next.val <= tmp.val:
q = q.next
else:
tmp.next = q.next
q.next = tmp
break
return root.next
```
```python=
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def insertionSortList(self, head: Optional[ListNode]) -> Optional[ListNode]:
if not head or not head.next:
return head
dummy = ListNode(0, head)
prev, cur = head, head.next
while cur:
if cur.val >= prev.val:
prev, cur = cur, cur.next
continue
tmp = dummy
while cur.val > tmp.next.val:
tmp = tmp.next
prev.next = cur.next
cur.next = tmp.next
tmp.next = cur
cur = prev.next
return dummy.next
```
+ Link
+ https://blog.csdn.net/fuxuemingzhu/article/details/80785630