https://leetcode.com/problems/merge-k-sorted-lists/description/
input :
output :
조건 :
Solution explain : Solution1
now라고 지정한다. head에 들어있는 원소는 prev로 head에서 부터 순회할 것이다.ListNode를 찾기 위한 반복문을 우선적으로 수행하고 이에 해당하는 것이 없다면 None을 반환한다.ListNode 다음의 노드 부터 순회를 시작하며 찾아야 하는 경우는 2가지 이다. 정렬되어 있으므로 현재 들어가는 값 now보다 큰 값들만 이후에 나오게 된다. val를 리스트에 정렬한다. # Definition for singly-linked list.
from typing import Optional, List
class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next
class Solution:
    # def mergeKLists(self, lists: List[Optional[ListNode]]) -> Optional[ListNode]:
    #     head = None
    #     for idx in range(len(lists)):
    #         if lists[idx]:
    #             head = lists[idx]
    #             break
    #
    #     if head is None:
    #         return head
    #
    #     for now in lists[idx + 1:]:
    #         prev = head
    #         while prev and now:
    #             if now.val < prev.val:
    #                 # 언제나 head가 바뀜
    #                 temp_node = ListNode(now.val, None)
    #                 temp_node.next = prev
    #                 head = temp_node
    #                 now = now.next
    #                 prev = temp_node
    #                 continue
    #
    #             if not prev.next:
    #                 break
    #
    #             if prev.val <= now.val <= prev.next.val:
    #                 temp_node = ListNode(now.val, None)
    #                 temp_next = prev.next
    #                 prev.next = temp_node
    #                 temp_node.next = temp_next
    #                 now = now.next
    #                 prev = prev.next
    #                 continue
    #             prev = prev.next
    #
    #         if not prev.next:
    #             prev.next = now
    #     return head
    def mergeKLists(self, lists: List[Optional[ListNode]]) -> Optional[ListNode]:
        # 정렬
        head = None
        temp = []
        for now in lists:
            while now:
                temp.append(now.val)
                now = now.next
        temp.sort()
        if len(temp) == 0:
            return head
        head = ListNode(temp[0], None)
        now = head
        for i in range(1, len(temp)):
            temp_node = ListNode(temp[i], None)
            now.next = temp_node
            now = temp_node
        return head
# node2 = ListNode(5, None)
# node1 = ListNode(4, node2)
# node0 = ListNode(1, node1)
#
# node5 = ListNode(4, None)
# node4 = ListNode(3, node5)
# node3 = ListNode(1, node4)
#
# node8 = ListNode(6, None)
# node7 = ListNode(2, node8)
node27 = ListNode(7, None)
node26 = ListNode(4, node27)
node25 = ListNode(0, node26)
node24 = ListNode(-4, node25)
node17 = ListNode(7, None)
node16 = ListNode(5, node17)
node15 = ListNode(2, node16)
node14 = ListNode(1, node15)
node7 = ListNode(6, None)
node6 = ListNode(4, node7)
node5 = ListNode(3, node6)
node4 = ListNode(1, node5)
s = Solution()
ret = s.mergeKLists([node4, node14, node24])
while ret:
    print(ret.val, end=" ")
    ret = ret.next