:type head: Node
    :rtype: Node
    """
    t = prev = Node(0)
    prev.next = head  # 0  1 2 3 4

    while head and head.next:
        prev.next = head.next  # 0  2 3 4
        head.next = head.next.next  # 1  3 4
        prev.next.next = head  # 0 2  1 3 4
        head = head.next  # 3 4
        prev = prev.next.next  # 1 3 4
    return t.next


head = generate_nodes([1, 2, 3, 4])
head = swap_pairs(head)
print(traverse_list(head))


def swap_pairs_sol2(head):
    if not head or not head.next:
        return head
    second = head.next
    head.next = swap_pairs_sol2(second.next)
    second.next = head
    return second


head = swap_pairs_sol2(head)
print(traverse_list(head))

def merge_k_lists(lists):
    """
    :type lists: List[ListNode]
    :rtype: ListNode
    """
    head = point = Node(0)
    q = PriorityQueue()
    for l in lists:
        q.put((l.val, id(l), l))

    while not q.empty():
        # get the lowest from queue
        val, _id, node = q.get()
        point.next = Node(val)
        point = point.next
        node = node.next
        if node:
            q.put((node.val, id(node), node))
    return head.next


head_1 = generate_nodes([1, 4, 5])
head_2 = generate_nodes([1, 3, 4])
head_3 = generate_nodes([2, 6])
head_4 = generate_nodes([1, 1])

o = merge_k_lists([head_1, head_2, head_3, head_4])
print(traverse_list(o))
Exemple #3
0
 def test_1(self):
     l1 = generate_nodes([1, 2, 4])
     l2 = generate_nodes([1, 3, 4])
     output = merge_two_lists(l1, l2)
     self.assertEqual(traverse_list(output), [1, 1, 2, 3, 4, 4])
 def test_1(self):
     l1 = generate_nodes([1, 2])
     output = swap_pairs(l1)
     self.assertEqual(traverse_list(output), [2, 1])
Exemple #5
0
 def test_2(self):
     l1 = generate_nodes([])
     l2 = generate_nodes([])
     output = merge_two_lists(l1, l2)
     self.assertEqual(traverse_list(output), [])
Exemple #6
0
 def test_1(self):
     arr1 = generate_nodes([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
     out = remove_nth_frm_end(arr1, 4)
     self.assertEqual(traverse_list(out), [1, 2, 3, 4, 5, 6, 8, 9, 10])
Exemple #7
0
 def test_4(self):
     arr1 = generate_nodes([1, 2, 3, 4])
     out = remove_nth_frm_end(arr1, 4)
     self.assertEqual(traverse_list(out), [2, 3, 4])

def remove_nth_frm_end(head, n):
    """
    2 pointer algo
    :type head: ListNode
    :type n: int
    :rtype: ListNode
    """
    tmp = Node(-1)
    tmp.next = head

    pointer_1 = tmp
    pointer_2 = tmp

    # Move over n nodes including dummy
    for i in range(n):
        pointer_2 = pointer_2.next  # set pointer_2 to n-1 th

    # Increment ptrs till you reach end of list
    while pointer_2.next:
        pointer_1 = pointer_1.next
        pointer_2 = pointer_2.next
    # Now pointer_1.next points to the nth node from the end
    pointer_1.next = pointer_1.next.next

    return head


hea = remove_nth_frm_end(generate_nodes([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]), 4)
print(traverse_list(hea))
"""
Merge two sorted linked lists and return it as a new list. The new list should be made by splicing together the nodes of the first two lists.

Example:

Input: 1->2->4, 1->3->4
Output: 1->1->2->3->4->4
"""
from linked_list.LinkedList import generate_nodes, traverse_list, Node

head_1 = generate_nodes([1, 2, 4])
head_2 = generate_nodes([1, 3, 4])


def merge_two_lists(l1, l2):
    """
    :type l1: Head Node 1 : 1, 2, 4
    :type l2: Head Node 2 : 1, 3, 4
    :rtype: ListNode 1->1->2->3->4->4
    """
    if not l1 or not l2:
        return l1 or l2

    if l1.val < l2.val:
        l1.next = merge_two_lists(l1.next, l2)
        return l1
    else:
        l2.next = merge_two_lists(l1, l2.next)
        return l2