コード例 #1
0
def test_solutions():
    inter = ListNode.initList([1, 8, 4, 5])
    headA = ListNode.initList([4])
    headB = ListNode.initList([5, 0])
    headA.next = inter
    headB.next = inter
    res = Solution().getIntersectionNode(headA, headB)
    assert res == inter
コード例 #2
0
def test_solutions():
    l1 = ListNode.initList([4, 1, 8, 4, 5])
    l2 = ListNode.initList([5, 0])
    l2.next.next = l1.next
    res = Solution().getIntersectionNode(l1, l2)
    res1 = Solution1().getIntersectionNode(l1, l2)
    assert res == l1.next
    assert res1 == l1.next
コード例 #3
0
def test_solutions():
    head = ListNode.initList([3, 2, 0, -4])
    cur = head
    while cur.val != 0:
        cur = cur.next
    cur.next = head
    res = Solution().detectCycle(head)
    assert res.val == 3
コード例 #4
0
def test_solution():
    l = ListNode.initList([3, 2, 0, -4])
    assert not Solution().hasCycle(l)
    cur = l
    while cur.next:
        cur = cur.next
    cur.next = l
    assert Solution().hasCycle(l)
コード例 #5
0
def test_solution():
    cycle = ListNode.initList([2, 0, -4])
    cur = cycle
    while cur.next:
        cur = cur.next
    cur.next = cycle
    head = ListNode(3)
    head.next = cycle
    res = Solution().detectCycle(head)
    assert res and res.val == 2
コード例 #6
0
        if not head:
            return True
        if not root:
            return False

        return dfs(head, root) or self.isSubPath(
            head, root.left) or self.isSubPath(head, root.right)


# leetcode submit region end(Prohibit modification and deletion)


@pytest.mark.parametrize("kwargs,expected", [
    (dict(
        head=ListNode.initList([4, 2, 8]),
        root=TreeNode(1,
                      left=TreeNode(4, right=TreeNode(2, left=TreeNode(1))),
                      right=TreeNode(4,
                                     left=TreeNode(2,
                                                   left=TreeNode(6),
                                                   right=TreeNode(
                                                       8, TreeNode(1),
                                                       TreeNode(3)))))), True),
    pytest.param(
        dict(head=ListNode.initList([1, 4, 2, 6]),
             root=TreeNode(1,
                           left=TreeNode(4,
                                         right=TreeNode(2, left=TreeNode(1))),
                           right=TreeNode(4,
                                          left=TreeNode(2,
コード例 #7
0
class Solution1:
    def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode:
        dummy = ListNode(-1)
        dummy.next = head
        first = head
        second = dummy
        for i in range(n):
            first = first.next
        while first:
            first = first.next
            second = second.next

        second.next = second.next.next
        return dummy.next


@pytest.mark.parametrize("kw,expected", [
    [
        dict(head=ListNode.initList(list(range(1, 6))), n=2),
        ListNode.init_list_from_str("1->2->3->5")
    ],
])
@pytest.mark.parametrize("SolutionCLS", [Solution, Solution1])
def test_solutions(kw, expected, SolutionCLS):
    assert repr(
        SolutionCLS().removeNthFromEnd(**copy.deepcopy(kw))) == repr(expected)


if __name__ == '__main__':
    pytest.main(["-q", "--color=yes", "--capture=no", __file__])
コード例 #8
0
class Solution1:
    def deleteDuplicates(self, head: ListNode) -> ListNode:
        dummy = ListNode(-1)
        dummy.next = head

        cur = dummy
        while cur.next and cur.next.next:
            if cur.next.val == cur.next.next.val:
                x = cur.next.val
                while cur.next and cur.next.val == x:
                    cur.next = cur.next.next
            else:
                cur = cur.next

        return dummy.next


@pytest.mark.parametrize("kw,expected", [
    [dict(head=ListNode.initList([1, 2, 3, 3, 4, 4, 5])), ListNode.initList([1, 2, 5])],
    [dict(head=ListNode.initList([1, 1, 1, 2, 3])), ListNode.initList([2, 3])],
    [dict(head=ListNode.initList([3, 1, 1, 1, 2, 2, 2])), ListNode.initList([3])],
])
@pytest.mark.parametrize("SolutionCLS", [Solution, Solution1])
def test_solutions(kw, expected, SolutionCLS):
    assert repr(SolutionCLS().deleteDuplicates(**copy.deepcopy(kw))) == repr(expected)


if __name__ == '__main__':
    pytest.main(["-q", "--color=yes", "--capture=no", __file__])
コード例 #9
0
                cur = cur.next
            res.append(head.next)
        return res


# leetcode submit region end(Prohibit modification and deletion)


@pytest.mark.parametrize("kwargs,expected", [
    [
        dict(tree=TreeNode(1,
                           left=TreeNode(2, TreeNode(4, left=TreeNode(8)),
                                         TreeNode(5)),
                           right=TreeNode(3, right=TreeNode(7)))),
        [
            ListNode(1),
            ListNode.initList([2, 3]),
            ListNode.initList([4, 5, 7]),
            ListNode.initList([8]),
        ]
    ],
])
def test_solutions(kwargs, expected):
    res = Solution().listOfDepth(**kwargs)
    # print(res)
    assert all(repr(x) == repr(y) for x, y in zip(res, expected))


if __name__ == '__main__':
    pytest.main(["-q", "--color=yes", "--capture=tee-sys", __file__])
コード例 #10
0
class Solution:
    def oddEvenList(self, head: ListNode) -> ListNode:
        """
        TODO
        https://leetcode-cn.com/problems/odd-even-linked-list/solution/qi-ou-lian-biao-by-leetcode/
        我们用变量 head 和 odd_tail 保存奇链表的头和尾指针。 even_head 和 cur 保存偶链表的头和尾指针
        """
        if not (head and head.next):
            return head
        odd_tail, even, even_head = head, head.next, head.next
        while even and even.next:
            odd_tail.next = even.next
            odd_tail = odd_tail.next
            even.next = odd_tail.next
            even = even.next
        odd_tail.next = even_head
        return head


@pytest.mark.parametrize("args,expected", [(
    ListNode.initList([1, 2, 3, 4, 5]),
    ListNode.initList([1, 3, 5, 2, 4]),
)])
def test_solutions(args, expected):
    assert repr(Solution().oddEvenList(args)) == repr(expected)


if __name__ == '__main__':
    pytest.main(["-q", "--color=yes", "--capture=no", __file__])
コード例 #11
0
        if not head:
            return head
        slow = head
        fast = head.next
        while fast:
            if fast.val != slow.val:
                slow.next = fast
                slow = slow.next
            fast = fast.next
        slow.next = None
        return head


@pytest.mark.parametrize("kw,expected", [
    [
        dict(head=ListNode.initList([1, 2, 3, 4, 5, 5])),
        ListNode.initList([1, 2, 3, 4, 5])
    ],
    [
        dict(head=ListNode.initList([1, 1, 1, 2, 3])),
        ListNode.initList([1, 2, 3])
    ],
])
def test_solutions(kw, expected):
    assert repr(
        Solution().deleteDuplicates(**copy.deepcopy(kw))) == repr(expected)
    assert repr(
        Solution1().deleteDuplicates(**copy.deepcopy(kw))) == repr(expected)


if __name__ == '__main__':
コード例 #12
0
        old_tail.next = head

        # find new tail : (n - k % n - 1)th node
        # and new head : (n - k % n)th node
        new_tail = head
        for i in range(n - k % n - 1):
            new_tail = new_tail.next
        new_head = new_tail.next

        # break the ring
        new_tail.next = None

        return new_head


@pytest.mark.parametrize("args,expected", [
    [(ListNode.initList([1, 2, 3, 4, 5]), 2),
     ListNode.initList([4, 5, 1, 2, 3])],
    [(ListNode.initList([0, 1, 2]), 4),
     ListNode.initList([2, 0, 1])],
    [(ListNode.initList([1, 2]), 2),
     ListNode.initList([1, 2])],
])
def test_solutions(args, expected):
    assert repr(Solution().rotateRight(*copy.deepcopy(args))) == repr(expected)
    assert repr(Solution1().rotateRight(*args)) == repr(expected)


if __name__ == '__main__':
    pytest.main(["-q", "--color=yes", "--capture=no", __file__])
コード例 #13
0
                cur_head.next = l1
                l1 = l1.next
            elif l1.val > l2.val:
                cur_head.next = l2
                l2 = l2.next
            cur_head = cur_head.next
        while l1:
            cur_head.next = l1
            l1 = l1.next
            cur_head = cur_head.next
        while l2:
            cur_head.next = l2
            l2 = l2.next
            cur_head = cur_head.next
        return dummyHead.next


@pytest.mark.parametrize("kw,expected", [
    [
        dict(l1=ListNode.init_list_from_str("1->2->4"),
             l2=ListNode.init_list_from_str("1->3->4")),
        ListNode.initList([1, 1, 2, 3, 4, 4])
    ],
])
def test_solutions(kw, expected):
    assert repr(Solution().mergeTwoLists(**kw)) == repr(expected)


if __name__ == '__main__':
    pytest.main(["-q", "--color=yes", "--capture=no", __file__])
コード例 #14
0
        sorted_l2 = self.sortList(slow)
        return self.mergeTwoLists(sorted_l1, sorted_l2)

    def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:
        dummy = ListNode(-1)
        cur = dummy
        while l1 and l2:
            if l1.val <= l2.val:
                cur.next = l1
                cur = cur.next
                l1 = l1.next
            else:
                cur.next, cur, l2 = l2, l2, l2.next
        if l1:
            cur.next = l1
        if l2:
            cur.next = l2
        return dummy.next


@pytest.mark.parametrize("args,expected", [(
    ListNode.initList([4, 2, 1, 3]),
    ListNode.initList([1, 2, 3, 4]),
)])
def test_solutions(args, expected):
    assert repr(Solution().sortList(args)) == repr(expected)


if __name__ == '__main__':
    pytest.main(["-q", "--color=yes", "--capture=no", __file__])
コード例 #15
0
                start = end
            end = end.next
        start.next = list2
        while list2.next:
            list2 = list2.next
        list2.next = end.next
        end.next = None
        return list1


# leetcode submit region end(Prohibit modification and deletion)


@pytest.mark.parametrize("kw,expected", [
    [
        dict(list1=ListNode.initList([0, 1, 2, 3, 4, 5]),
             a=3,
             b=4,
             list2=ListNode.initList([1000000, 1000001, 1000002])),
        ListNode.initList([0, 1, 2, 1000000, 1000001, 1000002, 5])
    ],
    [
        dict(list1=ListNode.initList([0, 1, 2, 3, 4, 5, 6]),
             a=2,
             b=5,
             list2=ListNode.initList(
                 [1000000, 1000001, 1000002, 1000003, 1000004])),
        ListNode.initList(
            [0, 1, 1000000, 1000001, 1000002, 1000003, 1000004, 6])
    ],
])
コード例 #16
0
        cur = head
        while cur:
            dummy.next, cur.next, cur = cur, dummy.next, cur.next
        return dummy.next


class Solution1:
    def reverseList(self, head: ListNode) -> ListNode:
        if not (head and head.next):
            return head
        p = self.reverseList(head.next)
        head.next.next = head
        head.next = None
        return p


@pytest.mark.parametrize("kw,expected", [
    [
        dict(head=ListNode.initList([1, 2, 3, 4, 5])),
        ListNode.initList([5, 4, 3, 2, 1])
    ],
])
def test_solutions(kw, expected):
    kw1 = copy.deepcopy(kw)
    assert repr(Solution().reverseList(**kw)) == repr(expected)
    assert repr(Solution1().reverseList(**kw1)) == repr(expected)


if __name__ == '__main__':
    pytest.main(["-q", "--color=yes", "--capture=no", __file__])
コード例 #17
0

class Solution:
    def numComponents(self, head: ListNode, G: List[int]) -> int:
        """
        TODO 题义转换
        我们对链表进行一次扫描,一个组件在链表中对应一段极长的连续节点,因此如果当前的节点在列表 G 中,
        并且下一个节点不在列表 G 中,我们就找到了一个组件的尾节点,可以将答案加 1
        """
        lookup = set(G)
        dummy = ListNode(-1)
        dummy.next = head
        cur = dummy
        result = 0
        while cur and cur.next:
            if cur.val not in lookup and cur.next.val in lookup:
                result += 1
            cur = cur.next
        return result


@pytest.mark.parametrize(
    "args,expected", [([ListNode.initList([0, 1, 2, 3]), [0, 1, 3]], 2),
                      ([ListNode.initList([0, 1, 2, 3, 4]), [0, 3, 1, 4]], 2)])
def test_solutions(args, expected):
    assert Solution().numComponents(*args) == expected


if __name__ == '__main__':
    pytest.main(["-q", "--color=yes", "--capture=no", __file__])
コード例 #18
0
from common_utils import ListNode


class Solution:

    def deleteNode(self, head: ListNode, val: int) -> ListNode:
        dummy = ListNode(-1)
        dummy.next = head
        prev, cur = dummy, head
        while cur:
            if cur.val == val:
                break
            prev, cur = cur, cur.next
        prev.next = cur.next
        return dummy.next


@pytest.mark.parametrize("head,val,expected", [
    (ListNode.initList([4, 5, 1, 9]), 5, ListNode.initList([4, 1, 9]))
])
def test_solutions(head, val, expected):
    res = Solution().deleteNode(head, val)
    while res and expected:
        assert res.val == expected.val
        res, expected = res.next, expected.next
    assert res is None and expected is None


if __name__ == '__main__':
    pytest.main(["-q", "--color=yes", "--capture=no", __file__])
コード例 #19
0
                carry += l2.val
                l2 = l2.next

            ans.next = ListNode(carry % 10)
            ans = ans.next
            carry //= 10
        if carry:
            ans.next = ListNode(carry)
        return dummy.next


# leetcode submit region end(Prohibit modification and deletion)


@pytest.mark.parametrize(
    "kwargs,expected",
    [
        [
            dict(l1=ListNode.initList([7, 1, 6]),
                 l2=ListNode.initList([5, 9, 2])),
            ListNode.initList([2, 1, 9])
        ],
        # [dict(l1=ListNode.initList([6, 1, 7]), l2=ListNode.initList([2, 9, 5])), ListNode.initList([9, 1, 2])],
    ])
def test_solutions(kwargs, expected):
    assert repr(Solution().addTwoNumbers(**kwargs)) == repr(expected)


if __name__ == '__main__':
    pytest.main(["-q", "--color=yes", "--capture=tee-sys", __file__])
コード例 #20
0
            increase_stack.append((len(result), cur_val))
            result.append(0)
        return result


class Solution1:
    def nextLargerNodes(self, head: ListNode) -> List[int]:
        result, stack = [], []
        while head:
            while stack and stack[-1][1] < head.val:
                idx, v = stack.pop()
                result[idx] = head.val
            stack.append((len(result), head.val))
            result.append(0)
            head = head.next
        # print(stack)
        return result


@pytest.mark.parametrize("args,expected", [
    (ListNode.initList([2, 1, 5]), [5, 5, 0]),
    (ListNode.initList([2, 7, 4, 3, 5]), [7, 0, 5, 5, 0]),
    (ListNode.initList([1, 7, 5, 1, 9, 2, 5, 1]), [7, 9, 9, 9, 0, 5, 0, 0]),
])
def test_solutions(args, expected):
    assert Solution().nextLargerNodes(args) == expected


if __name__ == '__main__':
    pytest.main(["-q", "--color=yes", "--capture=no", __file__])
コード例 #21
0
        while cur:
            prev = dummy
            while prev.next.val < cur.val:
                prev = prev.next
            if prev == sorted_tail:
                cur, sorted_tail = cur.next, cur
            else:
                cur.next, prev.next, sorted_tail.next = prev.next, cur, cur.next
                cur = sorted_tail.next
        return dummy.next


@pytest.mark.parametrize("kw,expected", [
    [
        dict(head=ListNode.init_list_from_str("4->2->1->3")),
        ListNode.initList([1, 2, 3, 4])
    ],
    [
        dict(head=ListNode.init_list_from_str("-1->5->3->4->0")),
        ListNode.initList([-1, 0, 3, 4, 5])
    ],
])
def test_solutions(kw, expected):
    kw1 = copy.deepcopy(kw)
    assert repr(Solution().insertionSortList(**kw)) == repr(expected)
    assert repr(Solution1().insertionSortList(**kw1)) == repr(expected)


if __name__ == '__main__':
    pytest.main(["-q", "--color=yes", "--capture=no", __file__])
コード例 #22
0
def test_solutions():
    head = ListNode.initList(list(range(9)))
    sol = Solution(head)
    assert sol.getRandom()
コード例 #23
0
        我们正处于Nk
        所以
        Nk.next.next=Nk

        """
        if not (head and head.next):
            return head
        p = self.reverseList(head.next)
        head.next.next = head
        head.next = None
        return p


@pytest.mark.parametrize("kw,expected", [
    [
        dict(head=ListNode.initList([1, 2, 3, 4, 5])),
        ListNode.initList([1, 2, 3, 4, 5][::-1])
    ],
    [dict(head=ListNode.initList([1, 2])),
     ListNode.initList([2, 1])],
    [dict(head=ListNode.initList([1])),
     ListNode.initList([1])],
])
@pytest.mark.parametrize("SolutionCLS", [Solution1, Solution2, Solution])
def test_solutions(kw, expected, SolutionCLS):
    assert repr(
        SolutionCLS().reverseList(**copy.deepcopy(kw))) == repr(expected)


if __name__ == '__main__':
    pytest.main(["-q", "--color=yes", "--capture=no", __file__])
コード例 #24
0
            curr = curr.next
            n += 1
        width, remainder = divmod(n, k)

        result = []
        curr = root
        for i in range(k):
            head = curr
            for j in range(width - 1 + int(i < remainder)):
                if curr:
                    curr = curr.next
            if curr:
                curr.next, curr = None, curr.next
            result.append(head)
        return result


@pytest.mark.parametrize("kw,expected", [
    [dict(root=ListNode.initList([1, 2, 3]), k=5), [[1], [2], [3], [], []]],
    [dict(root=ListNode.initList([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]), k=3),
     [[1, 2, 3, 4], [5, 6, 7], [8, 9, 10]]],
])
def test_solutions(kw, expected):
    expected = [ListNode.initList(x) for x in expected]
    res = Solution().splitListToParts(**kw)
    assert repr(res) == repr(expected)


if __name__ == '__main__':
    pytest.main(["-q", "--color=yes", "--capture=no", __file__])
コード例 #25
0
        prev, head = None, None
        sum = 0
        while stack1 or stack2:
            sum //= 10
            if stack1:
                sum += stack1.pop()
            if stack2:
                sum += stack2.pop()
            head = ListNode(sum % 10)
            head.next = prev
            prev = head
        if sum >= 10:
            head = ListNode(sum // 10)
            head.next = prev
        return head


@pytest.mark.parametrize("kw,expected", [
    [
        dict(l1=ListNode.init_list_from_str("7 -> 2 -> 4 -> 3"),
             l2=ListNode.init_list_from_str("5 -> 6 -> 4")),
        ListNode.initList([7, 8, 0, 7])
    ],
])
def test_solutions(kw, expected):
    assert repr(Solution().addTwoNumbers(**kw)) == repr(expected)


if __name__ == '__main__':
    pytest.main(["-q", "--color=yes", "--capture=no", __file__])
コード例 #26
0
        while l1 or l2:
            x = l1.val if l1 else 0
            y = l2.val if l2 else 0
            v_sum = x + y + carry
            carry = v_sum // 10
            curr_node.next = ListNode(v_sum % 10)
            curr_node = curr_node.next
            if l1:
                l1 = l1.next
            if l2:
                l2 = l2.next
        if carry:
            curr_node.next = ListNode(1)
        return head_node.next


@pytest.mark.parametrize("kw,expected", [
    [
        dict(l1=ListNode.initList([2, 4, 3]), l2=ListNode.initList([5, 6, 4])),
        ListNode.initList([7, 0, 8])
    ],
])
def test_solutions(kw, expected):
    assert repr(Solution().addTwoNumbers(**kw)) == repr(expected)
    assert repr(Solution1().addTwoNumbers(**kw)) == repr(expected)


if __name__ == '__main__':
    pytest.main(["-q", "--color=yes", "--capture=no", __file__])
コード例 #27
0
                self.front_pointer = self.front_pointer.next
            return True

        return recursively_check(head)


class Solution3:
    def isPalindrome(self, head: ListNode) -> bool:
        l = []
        cur = head
        while cur:
            l.append(cur.val)
            cur = cur.next
        return list(reversed(l)) == l


@pytest.mark.parametrize("args,expected", [
    (ListNode.initList([1, 2, 3, 4, 5]), False),
    (ListNode.initList([1, 2, 3, 2, 1]), True),
    (ListNode.initList([1, 2, 3, 3, 2, 1]), True),
])
def test_solutions(args, expected):
    assert Solution().isPalindrome(copy.deepcopy(args)) == expected
    assert Solution1().isPalindrome(copy.deepcopy(args)) == expected
    assert Solution2().isPalindrome(copy.deepcopy(args)) == expected
    assert Solution3().isPalindrome(copy.deepcopy(args)) == expected


if __name__ == '__main__':
    pytest.main(["-q", "--color=yes", "--capture=no", __file__])
コード例 #28
0
from common_utils import ListNode

# leetcode submit region begin(Prohibit modification and deletion)
# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None


class Solution:
    def deleteNode(self, node):
        node.val = node.next.val
        node.next = node.next.next


# leetcode submit region end(Prohibit modification and deletion)


@pytest.mark.parametrize("args,expected", [
    (ListNode.initList([1, 2, 3]), ListNode.initList([2, 3])),
])
def test_solutions(args, expected):
    Solution().deleteNode(args)
    assert repr(args) == repr(expected)


if __name__ == '__main__':
    pytest.main(["-q", "--color=yes", "--capture=tee-sys", __file__])
コード例 #29
0
def test_solutions(kw, expected):
    expected = [ListNode.initList(x) for x in expected]
    res = Solution().splitListToParts(**kw)
    assert repr(res) == repr(expected)
コード例 #30
0
            prefix += cur.val
            seen[prefix] = cur
            cur = cur.next
        cur2 = dummy
        prefix = 0
        # // 第二遍遍历 若当前节点处sum在下一处出现了则表明两结点之间所有节点和为0 直接删除区间所有节点

        while cur2:
            prefix += cur2.val
            cur2.next = seen[prefix].next
            cur2 = cur2.next
        return dummy.next


@pytest.mark.parametrize("args,expected", [
    [ListNode.initList([1, 2, -3, 3, 1], ),
     ListNode.initList([3, 1])],
    [ListNode.initList([1, 2, 3, -3, 4], ),
     ListNode.initList([1, 2, 4])],
    [ListNode.initList([1, 2, 3, -3, -2], ),
     ListNode.initList([1])], [ListNode.initList(
         [], ), ListNode.initList([])],
    [ListNode.initList([0], ), ListNode.initList([])],
    [ListNode.initList([0, 0], ),
     ListNode.initList([])],
    [ListNode.initList([-1, 1, 0, 1], ),
     ListNode.initList([1])],
    [ListNode.initList([2, 2, -2, 1, -1, -1], ),
     ListNode.initList([2, -1])],
    [ListNode.initList([-1, -2, 0, -1, 2, 2, -1, 1], ),
     ListNode.initList([])],