示例#1
0
    cur_a, cur_b = headA, headB
    while cur_a != cur_b:
        cur_a = cur_a.next if cur_a else headB
        cur_b = cur_b.next if cur_b else headA
    return cur_a

# 此外,还有一种方法
# https://discuss.leetcode.com/topic/26018/python-solution-o-n-time-and-o-1-space
# 这种方法相比上两种稍微难理解点,因为最后的结果的正确性需要证明下,代码也更多一些,而且也没有运行优势
# 因此不再列出


if __name__ == '__main__':
    print _solve1(None, None)
    print _solve1(ListNode(1), None)
    print _solve1(None, ListNode(1))
    print _solve1(ListNode(1), ListNode(1))
    HEAD1 = ListNode.from_list([4, 5, 6, 7, 8, 0, 1])
    HEAD2 = ListNode.from_list([1, 2, 3])
    HEAD2.next = HEAD1.next.next.next
    HEAD1.print_list()
    HEAD2.print_list()
    print _solve1(HEAD1, HEAD2)
    print _solve1(HEAD2, HEAD1)
    HEAD2 = ListNode.from_list([1, 2, 3])
    HEAD2.next.next = HEAD1.next.next
    HEAD1.print_list()
    HEAD2.print_list()
    print _solve1(HEAD1, HEAD2)
    print _solve1(HEAD2, HEAD1)
示例#2
0
            l1 = l1.next
        else:
            cur.next = l2
            l2 = l2.next
        cur = cur.next
    cur.next = l1 if l1 else l2
    return dummy.next


def _solve1(l1, l2):
    def _help(l1, l2):
        if not l1:
            return l2
        if not l2:
            return l1

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

    return _help(l1, l2)


if __name__ == '__main__':
    l1 = ListNode.from_list([1, 3])
    l2 = ListNode.from_list([0, 4])
    _solve(l2, l1).print_list()
示例#3
0
# coding=utf-8
"""Remove Linked List Elements."""

from ListNode import ListNode


def _solve(head, val):
    dump = ListNode('a')
    dump.next = head
    prev, cur = dump, head
    while cur:
        if cur.val == val:
            prev.next = cur.next
            cur = cur.next
        else:
            prev, cur = cur, cur.next

    return dump.next


if __name__ == '__main__':
    print _solve(None, 0)
    _solve(ListNode(1), 0).print_list()
    print _solve(ListNode(1), 1)
    print _solve(ListNode.from_list([1, 1, 1, 1]), 1)
    _solve(ListNode.from_list([1, 2, 6, 4, 5, 6, 6]), 6).print_list()
示例#4
0
    if not head:
        return True
    length = 0
    cur = head
    while cur:
        cur = cur.next
        length += 1
    prev, next = None, None
    cur = head
    for _ in xrange(0, length / 2):
        next = cur.next
        cur.next = prev
        prev, cur = cur, next
    if length & 1 == 1:
        cur = cur.next
    while cur:
        if cur.val != prev.val:
            return False
        cur = cur.next
        prev = prev.next
    return True


if __name__ == '__main__':
    print _solve(None)
    print _solve(ListNode(1))
    print _solve(ListNode.from_list([1, 2, 1]))
    print _solve(ListNode.from_list([1, 2, 2]))
    print _solve(ListNode.from_list([1, 2, 2, 1]))
    print _solve(ListNode.from_list([1, 2, 2, 2]))
示例#5
0
        slow = slow.next
        quick = quick.next and quick.next.next
    return quick == slow


# 翻转列表,如果有环,翻转列表后,一定会回到头部
# 这种方法会破坏原 NodeList


def _solve1(head):
    prev, cur, next = None, head, None
    while cur and cur.next:
        if cur.next == head:
            return True
        next = cur.next
        cur.next = prev
        prev, cur = cur, next
    return False


if __name__ == '__main__':
    RECYCLE_NODE = ListNode.from_list([1, 2, 3])
    RECYCLE_NODE.next.next.next = RECYCLE_NODE
    node1 = ListNode(1)
    node1.next = node1
    print _solve1(RECYCLE_NODE)
    print _solve(node1)
    print _solve1(ListNode.from_list([1, 2, 3]))
    print _solve1(ListNode(1))
    print _solve1(None)
示例#6
0
        slow = fast = head
        while fast.next and fast.next.next:
            slow = slow.next
            fast = fast.next.next
        head1, head2 = head, slow.next
        slow.next = None
        head1 = _sort(head1)
        head2 = _sort(head2)

        prev = faker
        while head1 and head2:
            if head1.val < head2.val:
                prev.next = head1
                head1 = head1.next
            else:
                prev.next = head2
                head2 = head2.next
            prev = prev.next
        if head1:
            prev.next = head1
        else:
            prev.next = head2
        return faker.next

    return _sort(head)


if __name__ == '__main__':
    _solve(ListNode.from_list(range(1, 5001)))
    _solve1(ListNode.from_list(range(1, 5001)))