Пример #1
0
 def reverseList(self, head: ListNode) -> ListNode:
     if not head or not head.next:
         return head
     node = self.reverseList(head.next)
     head.next.next = head
     head.next = None
     return node
Пример #2
0
def getLinkLength(node: ListNode) -> int:
    head = ListNode(-1, node)
    count = 0
    while head.next:
        count += 1
        head = head.next
    return count
Пример #3
0
 def isPalindrome(self, head: ListNode) -> bool:
     """
     寻找链表的中间节点,在中间节点处将链接分为两半,并将前半段反转
     如
     [1, 2, 3, 2, 1]
     分为
     [1, 2, 3]
     [5, 4]
     """
     dummy = ListNode(-1, head)
     slow = dummy
     fast = slow.next
     count = 0
     while fast:
         count += 1
         fast = fast.next
         slow = slow.next
         if fast:
             count += 1
             fast = fast.next
     second_half = slow.next
     if count % 2 == 0:
         slow.next = None
         return equals(reverseLink(head), second_half)
     slow.next = None
     return equals(reverseLink(head).next or head, second_half or head)
Пример #4
0
def reverseLink(head: ListNode) -> ListNode:
    if not head or not head.next:
        return head
    node = reverseLink(head.next)
    head.next.next = head
    head.next = None
    return node
Пример #5
0
 def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode:
     dummy = ListNode(-1, head)
     front, back = head, dummy
     for i in range(n):
         front = front.next
         # if front is None:
         #     return dummy.next
     while front is not None:
         front = front.next
         back = back.next
     back.next = back.next.next
     return dummy.next
Пример #6
0
 def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
     """
     反转两个链表
     从最低位开始相加
     """
     l1 = reverseLink(l1)
     l2 = reverseLink(l2)
     dummy = ListNode(-1)
     node = dummy
     carry = 0
     while l1 or l2:
         cnt = (l1 and l1.val or 0) + (l2 and l2.val or 0) + carry
         node.next = ListNode(cnt % 10)
         node = node.next
         carry = int(cnt / 10)
         if l1:
             l1 = l1.next
         if l2:
             l2 = l2.next
     if carry:
         node.next = ListNode(carry)
     return reverseLink(dummy.next)
Пример #7
0
 def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
     if not l1 and not l2:
         return None
     if not l2:
         l2 = ListNode(0)
     if not l1:
         l1 = ListNode(0)
     l1.val = l1.val + l2.val
     if l1.val > 9:
         l1.val = l1.val - 10
         if l1.next:
             l1.next.val += 1
         else:
             l1.next = ListNode(1)
     l1.next = self.addTwoNumbers(l1.next, l2.next)
     return l1
Пример #8
0
    def reorderList(self, head: ListNode) -> None:
        """
        寻找链表的中间节点,在中间节点处将链接分为两半, 然后穿插两个链表
        如
        [1, 2, 3, 4, 5]
        分为
        [1, 2, 3]
        [5, 4]

        [1, 2, 3, 4]
        分为
        [1, 2]
        [4, 3]
        """
        dummy = ListNode(-1, head)
        slow = dummy
        fast = dummy.next
        while fast:
            fast = fast.next
            slow = slow.next
            if fast:
                fast = fast.next
        right = slow.next
        slow.next = None
        left = dummy.next
        right = reverseLink(right)
        while left:
            node = left.next
            left.next = right
            if right:
                node2 = right.next
                right.next = node
                right = node2
            left = node

        return None
Пример #9
0
 def call(self, a: List[int], b: List[int]) -> int:
     node = self.getIntersectionNode(ListNode.fromList(a),
                                     ListNode.fromList(b))
     return node.val
Пример #10
0
 def call(self, l: List[int]) -> List[int]:
     node = self.reverseList(ListNode.fromList(l))
     return node and node.toList() or []
Пример #11
0
 def call(self, data: List[int], k: int) -> List[int]:
     head = self.removeNthFromEnd(ListNode.fromList(data), k)
     return head and head.toList() or []
Пример #12
0
 def call(self, data: List[int]) -> bool:
     return self.isPalindrome(ListNode.fromList(data))
Пример #13
0
 def call(self, l1: List[int], l2: List[int]) -> List[int]:
     node = self.addTwoNumbers(ListNode.fromList(l1), ListNode.fromList(l2))
     if not node:
         return []
     return node.toList()
Пример #14
0
 def call(self, data: List[int]) -> List[int]:
     head = ListNode.fromList(data)
     self.reorderList(head)
     return head.toList()
Пример #15
0
 def call(self,
          data: List[int],
          val: int,
          cycle: int = -1) -> Tuple[int, int]:
     node = self.insert(ListNode.fromList(data, cycle), val)
     return node.val
Пример #16
0
 def call(self, data: List[int], cycle: int) -> int:
     node = self.detectCycle(ListNode.fromList(data, cycle))
     if not node:
         return -1
     return node.val