coding/알고리즘,자료구조
leetcode - merge two sorted lists
Jeo
2022. 1. 17. 12:30
- 첫 시도
# Input: list1 = [1,2,4], list2 = [1,3,4]
# Output: [1,1,2,3,4,4]
l1 = createLinkedList([1,2,4])
l2 = createLinkedList([1,3,4])
def merge(l1:ListNode, l2:ListNode) -> ListNode:
head = ListNode(None)
node = head
last_node = ListNode(None)
while l1 is not None and l2 is not None: # 둘 다 빈 값으로 들어온 것이 아니라면
if l1.val > l2.val: # l1은 더 작은 쪽의 노드를 지칭하고 싶어서
l1, l2 = l2, l1 # 만약 l1보다 l2가 작다면 서로 이름을 바꾼다.
# 작은 쪽이 무조건 l1
node.next = l1 # 작은 쪽 값인 l1이 현재 node 의 다음 것으로 지정.
node = node.next # 현재 노드는 그 다음 칸으로 이동.
last_node = l1
l1 = l1.next # 지금 막 비교하기로는 포인터에서 더 작은 값을 지녔던 l1 라인에서도 한칸 옆으로 이동.
# 남아있는 마지막 l2 연결해주고 싶어서.
last_node.next = l2
return head
result_head = merge(l1, l2).next. ## next 안 붙이면 처음에 만들어둔 none의 head부터 나온다.
printNodes(result_head)
- 리트코드에 제출해봤더니 각 리스트가 none일 때에 대한 예외처리(?)가 필요한 것 같았다.
- 그래서 아래와 같이 수정했다. ( + 그 외 다른 점: 혼자서 l1, l2라고 쓰던거는 리트코드 제출 포맷대로 list1, list2로 수정, Solution 클래스 내부에서 함수 정의)
class Solution(object):
def mergeTwoLists(self, list1, list2):
"""
:type list1: Optional[ListNode]
:type list2: Optional[ListNode]
:rtype: Optional[ListNode]
"""
head = ListNode(None)
node = head
last_node = ListNode(None)
# 빈 것들로 왔을 때의 예외처리도 해줘야 하는구나..?!
if list1 is None:
return list2
if list2 is None:
return list1
while list1 is not None and list2 is not None: # 둘 다 빈 값으로 들어온 것이 아니라면
if list1.val > list2.val: # l1은 더 작은 쪽의 노드를 지칭하고 싶어서
list1, list2 = list2, list1 # 만약 l1보다 l2가 작다면 서로 이름을 바꾼다.
# 작은 쪽이 무조건 l1
node.next = list1 # 작은 쪽 값인 l1이 현재 node 의 다음 것으로 지정.
node = node.next # 현재 노드는 그 다음 칸으로 이동.
last_node = list1
list1 = list1.next # 지금 막 비교하기로는 포인터에서 더 작은 값을 지녔던 l1 라인에서도 한칸 옆으로 이동.
# 남아있는 마지막 l2 연결해주고 싶어서.
last_node.next = list2
return head.next
근데 나는 시간이 무지 많이 걸린다..... ㅎㅎ 다른 분들 코드 보면서 배워야지..