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
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
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
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)
# 方法二:循环 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)
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)