Beispiel #1
0
    def mergeTwoLists(self, l1, l2):
        """
        :type l1: ListNode
        :type l2: ListNode
        :rtype: ListNode
        """
        # 方法一:递归
        # if not l1:
        #     return l2
        # if not l2:
        #     return l1
        #
        # p = ListNode(None)
        # if l1.data < l2.data:
        #     p = l1
        #     p.next = self.mergeTwoLists(l1.next, l2)
        # else:
        #     p = l2
        #     p.next = self.mergeTwoLists(l1, l2.next)
        # return p

        # 方法二:循环
        p_head = p = ListNode(0)
        while l1 and l2:
            if l1.data < l2.data:
                p.next = l1
                l1 = l1.next
            else:
                p.next = l2
                l2 = l2.next
            p = p.next
        p.next = l1 or l2
        return p_head.next
Beispiel #2
0
def reverse_list(head):
    if head is None or head.next is None:
        return

    p_node = head.next
    p_pre = None
    p_res = None

    while p_node is not None:
        p_next = p_node.next

        if p_next is None:
            p_res = ListNode(None)
            p_res.next = p_node

        p_node.next = p_pre

        p_pre = p_node
        p_node = p_next

    return p_res
    def removeNthFromEnd(self, head, n):
        """
        :type head: ListNode
        :type n: int
        :rtype: ListNode
        """

        # 分三种情况:
        # 1,待删除结点是非头非尾结点(一般情况,即 n > 1)
        # 2,待删除结点是长度大于1的链表的尾节点(即n == 1)
        # 3,待删除结点是长度等于1的链表的尾节点(也即头节点, n == 1)
        # 针对1,则先让i走k-1,ij再同时走直到i走到尾,则j指向待删除结点,利用后一元素覆盖法直接删去即可
        # 针对2,此时无法使用后一元素覆盖法,只能用前驱去删,因此需要让j走到待删元素的前驱处,因此在初始时让j位于i前驱处即可
        # 针对3,则需将头结点修改为空

        if not head or n <= 0:
            return head

        if n == 1:
            pi = head
            pj = ListNode(0)
            pj.next = head
        else:
            pj = pi = head

        for i in range(n - 1):
            if pi:
                pi = pi.next
            else:
                return head

        while pi.next:
            pi = pi.next
            pj = pj.next

        if n == 1 and head == pi:
            return None
        if n == 1:
            pj.next = pj.next.next
        else:
            pj.data = pj.next.data
            pj.next = pj.next.next

        return head
Beispiel #4
0
    q = head2 if l2 <= l1 else head1
    for i in range(abs(l1 - l2)):
        p = p.next

    while p and q and p != q:
        if p == q:
            return q.data
        p = p.next
        q = q.next

    return -1


if __name__ == '__main__':
    # test
    list1_head = ListNode(None)
    for i in range(0, 14, 2):
        p = ListNode(i)
        add_node(list1_head, p)

    list2_head = ListNode(None)
    for i in range(1, 11, 3):
        p = ListNode(i)
        add_node(list2_head, p)

    p = ListNode(13)
    add_node(list1_head, p)
    add_node(list2_head, p)

    for i in range(0, 4, 2):
        p = ListNode(i)
Beispiel #5
0
        # 方法二:循环
        p_head = p = ListNode(0)
        while l1 and l2:
            if l1.data < l2.data:
                p.next = l1
                l1 = l1.next
            else:
                p.next = l2
                l2 = l2.next
            p = p.next
        p.next = l1 or l2
        return p_head.next


if __name__ == '__main__':
    head1 = ListNode(None)
    head2 = ListNode(None)
    for i in range(0, 10, 2):
        node = ListNode(i)
        add_node(head1, node)
    for i in range(1, 11, 2):
        node = ListNode(i)
        add_node(head2, node)

    print_list(head1)
    print_list(head2)

    print('-----------------')

    p = Solution().mergeTwoLists(head1.next, head2.next)
Beispiel #6
0
    p_pre = None
    p_res = None

    while p_node is not None:
        p_next = p_node.next

        if p_next is None:
            p_res = ListNode(None)
            p_res.next = p_node

        p_node.next = p_pre

        p_pre = p_node
        p_node = p_next

    return p_res


if __name__ == '__main__':

    head = ListNode(None)
    for i in range(4):
        node = ListNode(i)
        add_node(head, node)

    print_list(head)

    print('-----------------')

    after_reverse_head = reverse_list(head)
    print_list(after_reverse_head)
                return head

        while pi.next:
            pi = pi.next
            pj = pj.next

        if n == 1 and head == pi:
            return None
        if n == 1:
            pj.next = pj.next.next
        else:
            pj.data = pj.next.data
            pj.next = pj.next.next

        return head


if __name__ == '__main__':
    head = ListNode(None)
    for i in range(1):
        node = ListNode(i + 1)
        add_node(head, node)

    print_list(head)

    print('-----------------')

    p = Solution().removeNthFromEnd(head.next, 1)
    new_head = ListNode(None)
    new_head.next = p
    print_list(new_head)
    if head1 is None:
        return head2
    if head2 is None:
        return head1

    p = head1 if head1.data < head2.data else head2
    p.next = merge_list(head1.next,
                        head2) if head1.data < head2.data else merge_list(
                            head1, head2.next)

    return p


if __name__ == '__main__':
    list1_head = ListNode(None)
    for i in range(0, 10, 2):
        p = ListNode(i)
        add_node(list1_head, p)

    list2_head = ListNode(None)
    for i in range(1, 11, 2):
        p = ListNode(i)
        add_node(list2_head, p)

    print_list(list1_head)
    print_list(list2_head)

    print('-------------')

    new_head = ListNode(None)