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)
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()
# 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()
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]))
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)
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)))