def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode: if not l1: return l2 if not l2: return l1 if l1.val < l2.val: l1.next = self.mergeTwoLists(l1.next, l2) return l1 else: l2.next = self.mergeTwoLists(l1, l2.next) return l2
def reverseList1(self, head): """ :type head: ListNode :rtype: ListNode """ # 迭代:头插法 dummy = ListNode(0) while head: q = head.next head.next = dummy.next dummy.next = head head = q return dummy.next
def removeElements2(self, head, val): """ :type head: ListNode :type val: int :rtype: ListNode """ # 大神简化版,思想同上 dummy = ListNode(0) dummy.next = head cur = dummy while cur.next: if cur.next.val == val: cur.next = cur.next.next else: cur = cur.next return dummy.next
def swapPairs1(self, head): """ :type head: ListNode :rtype: ListNode """ # 循环 dummy = ListNode(0) dummy.next = head current = dummy while current.next and current.next.next: node1 = current.next node2 = node1.next node1.next = node2.next node2.next = node1 current.next = node2 current = current.next.next return dummy.next
def removeElements1(self, head, val): """ :type head: ListNode :type val: int :rtype: ListNode """ # 遍历链表,使用哑节点,不需为头结点特殊定制逻辑 dummy = ListNode(0) dummy.next = head pre = dummy p = head while p: if p.val == val: pre.next = p.next del p p = pre.next else: pre = pre.next p = p.next return dummy.next
def addTwoNumbers(self, l1, l2): """ :type l1: ListNode :type l2: ListNode :rtype: ListNode """ dummy = ListNode(0) dummy.next = l2 cur = dummy carry = 0 while l1 or l2: x = l1.val if l1 else 0 y = l2.val if l2 else 0 sum = x + y + carry carry = sum // 10 cur.next = ListNode(sum % 10) cur = cur.next l1 = l1.next if l1 else None l2 = l2.next if l2 else None if carry: cur.next = ListNode(carry) return dummy.next
# 递归 # 终止条件:当l1为空或l2为空时结束 # 返回值:每一层调用都返回排序好的链表头 # 本级递归内容:如果l1的val值更小,则将l1.next与排序好的链表头相接;l2同理 def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode: if not l1: return l2 if not l2: return l1 if l1.val < l2.val: l1.next = self.mergeTwoLists(l1.next, l2) return l1 else: l2.next = self.mergeTwoLists(l1, l2.next) return l2 if __name__ == '__main__': l1 = ListNode(1) l1.next = ListNode(2) l1.next.next = ListNode(4) l2 = ListNode(1) l2.next = ListNode(3) l2.next = ListNode(4) Sol = Solution() res = Sol.mergeTwoLists(l1, l2) while res: print(res.val) res = res.next
cur = cur.next return dummy.next def removeElements3(self, head, val): """ :type head: ListNode :type val: int :rtype: ListNode """ # 递归 if not head: return None head.next = self.removeElements3(head.next, val) if head.val == val: return head.next else: return head if __name__ == '__main__': head = ListNode(1) head.next = ListNode(2) head.next.next = ListNode(3) Sol = Solution() res = Sol.removeElements3(head, val=3) p = res while p: print(p.val) p = p.next
dummy = ListNode(0) dummy.next = l2 cur = dummy carry = 0 while l1 or l2: x = l1.val if l1 else 0 y = l2.val if l2 else 0 sum = x + y + carry carry = sum // 10 cur.next = ListNode(sum % 10) cur = cur.next l1 = l1.next if l1 else None l2 = l2.next if l2 else None if carry: cur.next = ListNode(carry) return dummy.next if __name__ == '__main__': l1 = ListNode(5) # l1.next = ListNode(4) # l1.next.next = ListNode(3) l2 = ListNode(5) # l2.next = ListNode(6) # l2.next.next = ListNode(4) Sol = Solution() res = Sol.addTwoNumbers(l1, l2) print(res)
p = r r = r.next p.next = pre return p def reverseList3(self, head): """ :type head: ListNode :rtype: ListNode """ # 递归 # 1.找终止条件。节点或下一个节点不存在时终止。 # 2.找返回值。返回翻转后的链表。 # 3.本级递归应该做什么。 if not head or not head.next: return head p = self.reverseList3(head.next) head.next.next = head head.next = None return p if __name__ == '__main__': head = ListNode(1) Sol = Solution() res = Sol.reverseList3(head) p = res while p: print(p.val) p = p.next