Пример #1
0
    def reverseBetween(self, head, m, n):
        """
        :type head: ListNode
        :type m: int
        :type n: int
        :rtype: ListNode
        """
        if m == n:
            return head

        dummy = ListNode(0)
        dummy.next = head

        # p1 points to (m-1)th node
        p1 = dummy
        for i in range(m - 1):
            p1 = p1.next

        # Reverse node from position m to n
        pre, curr = None, p1.next
        for i in range(n - m + 1):
            temp = curr.next
            curr.next = pre
            pre, curr = curr, temp

        # Let original mth node points to (n+1)th node
        p1.next.next = curr
        # Let original (m-1)th node points to nth node
        p1.next = pre
        return dummy.next
Пример #2
0
def main():
    l1 = ListNode.from_str("1 2 8 4")
    l2 = ListNode.from_str("2 0 3")
    ans = ListNode.from_str("3 2 1 5")

    result = addTwoNumbers(l1, l2)
    print(f"{l1} + {l2} = {result}")
    assert result == ans
Пример #3
0
def addTwoNumbers(l1: ListNode, l2: ListNode) -> ListNode:
    carry, sum_val = divmod(l1.val + l2.val, 10)
    ret = ListNode(sum_val)
    ret_ptr = ret
    zero = ListNode(0)
    while True:
        if l1.next is None and l2.next is None and carry == 0:
            break

        l1 = l1.next if l1.next else zero
        l2 = l2.next if l2.next else zero

        carry, sum_val = divmod(l1.val + l2.val + carry, 10)
        ret_ptr.next = ListNode(sum_val)
        ret_ptr = ret_ptr.next
    return ret
Пример #4
0
    def swapPairs(self, head):
        """
        :type head: ListNode
        :rtype: ListNode
        """
        dummy = ListNode(0)
        dummy.next = head

        curr = dummy
        while curr.next and curr.next.next:
            p1, p2 = curr.next, curr.next.next
            p1.next = p2.next
            p2.next = p1
            curr.next = p2
            curr = curr.next.next

        return dummy.next
Пример #5
0
    def removeNthFromEnd(self, head, n):
        """
        :type head: ListNode
        :type n: int
        :rtype: ListNode
        """
        dummy = ListNode(0)
        dummy.next = head

        p1, p2 = head, dummy
        for _ in range(n):
            p1 = p1.next

        while p1:
            p1 = p1.next
            p2 = p2.next
        p2.next = p2.next.next
        return dummy.next
Пример #6
0
    def removeElements(self, head, val):
        """
        :type head: ListNode
        :type val: int
        :rtype: ListNode
        """
        if not head:
            return None

        dummy = ListNode(0)
        dummy.next = head

        current = dummy
        while current:
            while current.next and current.next.val == val:
                current.next = current.next.next
            current = current.next

        return dummy.next
Пример #7
0
    def addTwoNumbers(self, l1, l2):
        """
        :type l1: ListNode
        :type l2: ListNode
        :rtype: ListNode
        """
        p1, p2 = l1, l2
        len1, len2 = 0, 0
        while p1 or p2:
            if p1:
                p1, len1 = p1.next, len1 + 1
            if p2:
                p2, len2 = p2.next, len2 + 1

        dummy = ListNode(0)
        curr = dummy
        size = max(len1, len2)
        while size:
            val = 0
            if size <= len1:
                val += l1.val
                l1 = l1.next
            if size <= len2:
                val += l2.val
                l2 = l2.next
            curr.next = ListNode(val)
            curr = curr.next
            size -= 1

        prev = dummy
        while prev:
            curr = prev.next
            while curr and curr.val == 9:
                curr = curr.next
            while prev != curr:
                if curr and curr.val > 9:
                    prev.val += 1
                    prev.next.val -= 10
                prev = prev.next

        if dummy.val:
            return dummy
        return dummy.next
Пример #8
0
 def partition(self, head, x):
     """
     :type head: ListNode
     :type x: int
     :rtype: ListNode
     """
     h1 = ListNode(0)
     h2 = ListNode(0)
     p1, p2 = h1, h2
     while head:
         if head.val < x:
             p1.next = head
             p1 = p1.next
         else:
             p2.next = head
             p2 = p2.next
         head = head.next
     p1.next = h2.next
     p2.next = None
     return h1.next
Пример #9
0
    def addTwoNumbers(self, l1, l2):
        """
        :type l1: ListNode
        :type l2: ListNode
        :rtype: ListNode
        """
        dummy = ListNode(0)
        node = dummy
        carry = 0
        while l1 or l2:
            carry = (l1.val if l1 else 0) + (l2.val if l2 else 0) + carry
            node.next = ListNode(carry % 10)
            carry //= 10
            node = node.next
            if l1:
                l1 = l1.next
            if l2:
                l2 = l2.next

        if carry:
            node.next = ListNode(carry)

        return dummy.next
Пример #10
0
    def sortedListToBST(self, head):
        """
        :type head: ListNode
        :rtype: TreeNode
        """
        if not head:
            return None

        dummy = ListNode(0)
        dummy.next = head

        p1, p2 = dummy, head
        while p2 and p2.next:
            p1 = p1.next
            p2 = p2.next.next

        mid = p1.next
        p1.next = None
        root = TreeNode(mid.val)
        if head != mid:
            root.left = self.sortedListToBST(head)
            root.right = self.sortedListToBST(mid.next)
        return root
Пример #11
0
    def rotateRight(self, head, k):
        """
        :type head: ListNode
        :type k: int
        :rtype: ListNode
        """
        if not head or k == 0:
            return head

        dummy = ListNode(0)
        dummy.next = head

        # Get list size
        p2, size = dummy, 0
        while p2.next:
            p2 = p2.next
            size += 1

        # Update k
        k = (k - 1) % size + 1

        # Find last k-th node
        p1, p2 = dummy, dummy
        for i in range(k):
            p2 = p2.next
        while p2.next:
            p1 = p1.next
            p2 = p2.next

        # Rotate
        if p1 != dummy:
            dummy.next = p1.next
            p1.next = None
            p2.next = head

        return dummy.next
Пример #12
0
    def mergeTwoLists(self, l1, l2):
        """
        :type l1: ListNode
        :type l2: ListNode
        :rtype: ListNode
        """
        dummy = ListNode(0)
        curr = dummy
        while l1 and l2:
            if l1.val > l2.val:
                curr.next = l2
                l2, curr = l2.next, curr.next
            else:
                curr.next = l1
                l1, curr = l1.next, curr.next

        if l1:
            curr.next = l1
        elif l2:
            curr.next = l2

        return dummy.next
Пример #13
0
def test_list_node_to_str():
    ln = ListNode.from_str("1 2 3")
    assert str(ln) == "1 -> 2 -> 3"
Пример #14
0
def test_list_node_from_str():
    l1 = ListNode.from_str("1 2 3")
    l2 = ListNode(1)
    l2.next = ListNode(2)
    l2.next.next = ListNode(3)
    assert l1 == l2