Exemple #1
0
        if not head:
            return head
        p1 = head
        lenh = 0
        while p1.next:
            p1 = p1.next
            lenh += 1
        lenh += 1
        k %= lenh
        if k == 0:
            return head

        dumpy = ListNode(0)
        dumpy.next = head
        p2 = head
        for _ in range(lenh - k - 1):
            p2 = p2.next
        dumpy.next = p2.next
        p1.next = head
        p2.next = None

        return dumpy.next


if __name__ == '__main__':
    nums = "1,2,3,4,5"
    k = 2
    head = stringToListNode(nums)
    sol = Solution()
    print(listNodeToString(sol.rotateRight(head, k)))
Exemple #2
0
输出:1->1->2->3->4->4
"""
from LinkList import ListNode, listNodeToString, stringToListNode


class Solution:
    def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:
        prehead = ListNode(-1)

        prev = prehead
        while l1 and l2:
            if l1.val <= l2.val:
                prev.next = l1
                l1 = l1.next
            else:
                prev.next = l2
                l2 = l2.next
            prev = prev.next
        prev.next = l1 if l1 is not None else l2
        return prehead.next


if __name__ == '__main__':
    input1 = "1, 2, 4"
    input2 = "1, 3, 4"
    l1 = stringToListNode(input1)
    l2 = stringToListNode(input2)
    sol = Solution()
    l = sol.mergeTwoLists(l1, l2)
    print(listNodeToString(l))
'''
实现一种算法,删除单向链表中间的某个节点(即不是第一个或最后一个节点),假定你只能访问该节点。

 

示例:

输入:单向链表a->b->c->d->e->f中的节点c
结果:不返回任何数据,但该链表变为a->b->d->e->f
'''
from LinkList import ListNode, stringToListNode


class Solution:
    def deleteNode(self, node):
        """
        :type node: ListNode
        :rtype: void Do not return anything, modify node in-place instead.
        """
        node.next = node.next.next
        node.val = node.next.val


if __name__ == '__main__':
    str_ = "a,b,c,d,e,f"
    node = stringToListNode(str_)
    sol = Solution()
    sol.deleteNode(node)
 

注意:

如果两个链表没有交点,返回 null.
在返回结果后,两个链表仍须保持原有的结构。
可假定整个链表结构中没有循环。
程序尽量满足 O(n) 时间复杂度,且仅用 O(1) 内存。
本题与主站 160 题相同:https://leetcode-cn.com/problems/intersection-of-two-linked-lists/
'''
from LinkList import ListNode, stringToListNode, listNodeToString


class Solution:
    def getIntersectionNode(self, headA: ListNode,
                            headB: ListNode) -> ListNode:
        pA, pB = headA, headB
        while pA != pB:
            pA = pA.next if pA else headB
            pB = pB.next if pB else headA
        return pA


if __name__ == '__main__':
    listA = "4,1,8,4,5"
    listB = "5,0,1,8,4,5"
    headA = stringToListNode(listA)
    headB = stringToListNode(listB)
    sol = Solution()
    print(listNodeToString(sol.getIntersectionNode(headA, headB)))
Exemple #5
0
            p = root
            for _ in range(div):
                root = root.next
            # p到root之间的结点,即为一段
            res[i] = p
            p = root
            root = root.next
            p.next = None
            i += 1
        # 长度正常的结点
        while i < k:
            p = root
            if div == 0:
                break
            for _ in range(div - 1):
                root = root.next
            res[i] = p
            p = root
            root = root.next
            p.next = None
            i += 1
        return res


if __name__ == '__main__':
    nums = "1,2,3"
    k = 5
    root = stringToListNode(nums)
    sol = Solution()
    sol.splitListToParts(root, k)
Exemple #6
0
class Solution:
    def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
        dumpy = ListNode(0)
        dumpy.next = l1
        l = dumpy
        ans = 0
        while l1 or l2:
            a = l1.val if l1 else 0
            b = l2.val if l2 else 0
            ans += a + b
            ans, mod = divmod(ans, 10)
            l.next = ListNode(mod)
            l = l.next
            if l1:
                l1 = l1.next
            if l2:
                l2 = l2.next
        if ans > 0:
            l.next = ListNode(1)
        return dumpy.next


if __name__ == '__main__':
    nums1 = "9"
    nums2 = "9"
    l1 = stringToListNode(nums1)
    l2 = stringToListNode(nums2)
    sol = Solution()
    print(listNodeToString(sol.addTwoNumbers(l1, l2)))
Exemple #7
0
            return l2
        if not l2:
            return l1
        if l1.val < l2.val:
            l1.next = self.merge(l1.next, l2)
            return l1
        l2.next = self.merge(l1, l2.next)
        return l2

    def mergeKLists(self, lists: List[ListNode]) -> ListNode:
        len_ = len(lists)
        if len_ < 1:
            return None
        if len_ == 1:
            return lists[0]

        mid = len_ // 2
        left = self.mergeKLists(lists[:mid])
        right = self.mergeKLists(lists[mid:])
        return self.merge(left, right)


if __name__ == '__main__':
    lists = [
        stringToListNode("1,4,5"),
        stringToListNode("1,3,4"),
        stringToListNode("2,6")
    ]
    sol = Solution()
    print(listNodeToString(sol.mergeKLists(lists)))