21. Merge Two Sorted Lists
O(n)
from typing import List

# Definition for singly-linked list.
class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None

class Solution:
    def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:
        w1 = l1
        w2 = l2

        l = ListNode(0)
        w = l

        while w1 is not None and w2 is not None:
            if w1.val < w2.val:
                w.next = ListNode(w1.val)
                w1 = w1.next
            else:
                w.next = ListNode(w2.val)
                w2 = w2.next
            w = w.next

        if w1 is not None:
            while w1 is not None:
                w.next = ListNode(w1.val)
                w1 = w1.next
                w = w.next

        if w2 is not None:
            while w2 is not None:
                w.next = ListNode(w2.val)
                w2 = w2.next
                w = w.next

        return l.next

def getList(l: List[int]) -> ListNode:
    head = None
    if not l:
        return head

    head = ListNode(l[0])
    walker = head
    for i in range(1, len(l)):
        walker.next = ListNode(l[i])
        walker = walker.next

    return head

def disp(l: ListNode) -> None:
    walker = l

    while walker is not None:
        print('-> '+str(walker.val), end = ' ')
        walker = walker.next
    print()

def main():
    l1 = getList([1, 2, 4])
    l2 = getList([1, 3, 4])

    disp(l1)
    disp(l2)

    s = Solution()
    l = s.mergeTwoLists(l1, l2)

    disp(l)

if __name__ == '__main__':
    main()