이모저모

leetcode - merge two sorted lists 본문

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

근데 나는 시간이 무지 많이 걸린다..... ㅎㅎ 다른 분들 코드 보면서 배워야지..

 

Comments