이 글은 "파이썬 알고리즘 인터뷰 (박상길 지음)"을 읽고 주관적으로 요약한 글입니다.
문제 정의
연결 리스트 정렬
책에서 구현된 코드
class Solution:
def sortList(self, head: ListNode) -> ListNode:
# 연결 리스트 -> 파이썬 리스트
p = head
lst: List = []
while p:
lst.append(p.val)
p = p.next
# 정렬
lst.sort()
# 파이썬 리스트 -> 연결 리스트
p = head
for i in range(len(lst)):
p.val = lst[i]
p = p.next
return head
기억해야할 기법
- 연결 리스트 정렬 방법
- 연결 리스트를 순차탐색하여 비교할값들의 배열로 바꿈
- 정렬
- 연결 리스트를 순차탐색하여 정렬된 값으로 바꿈
- Runner
- 연결 리스트에서 길이를 모를 때, 중간 위치를 찾는 방법
- slow는 1칸, fast는 2칸씩 다음 포인터로 이동
- fast가 끝에 도달하면 slow의 위치가 중간
내가 구현한 코드
class Solution:
def sortList(self, head: ListNode) -> ListNode:
root = head
if root:
arr = [root]
while root.next:
arr.append(root.next)
root = root.next
arr.sort(key=lambda x : x.val)
for i in range(len(arr)-1):
arr[i].next = arr[i+1]
arr[-1].next = None
root = arr[0]
return root
- 책에서 구현한 알고리즘이 더 빠르다
- 나는 노드를 배열로 만들고, 노드의 값으로 정렬해서, 배열 순서대로 노드를 다시 연결했다
- 이 노드에는 포함된 데이터가 하나(val)이므로 책에서 구현한 알고리즘이 더 효율적이다
- 그리고 Runner를 이전에 봤었는데 또 까먹었다! 기억하자
'책읽기' 카테고리의 다른 글
[파이썬 알고리즘 인터뷰][정렬] 삽입 정렬 리스트 (0) | 2021.08.07 |
---|---|
[파이썬 알고리즘 인터뷰][정렬] 구간 병합 (0) | 2021.08.07 |
[파이썬 알고리즘 인터뷰] 17장 - 정렬 (0) | 2021.08.06 |
[쉽게 배우는 데이터 통신과 컴퓨터 네트워크](요약)[Chapter-3] 네트워크 기술 (0) | 2021.08.06 |
[Java의 정석][Chapter-5] 배열 (0) | 2021.08.05 |