Example #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)))
Example #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))
Example #3
0
'''
反转一个单链表。

示例:

输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
进阶:
你可以迭代或递归地反转链表。你能否用两种方法解决这道题?
'''
from LinkList import ListNode, stringToListNode, listNodeToString


class Solution:
    def reverseList(self, head: ListNode) -> ListNode:
        dumpy = ListNode(0)
        first = head
        while head:
            head = head.next
            first.next = dumpy.next
            dumpy.next = first
            first = head
        return dumpy.next


if __name__ == '__main__':
    nums = "1,2,3,4,5"
    head = stringToListNode(nums)
    sol = Solution()
    print(listNodeToString(sol.reverseList(head)))
 

注意:

如果两个链表没有交点,返回 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)))
Example #5
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)))
Example #6
0
示例:

输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
进阶:
你可以迭代或递归地反转链表。你能否用两种方法解决这道题?
"""
from LinkList import ListNode, stringToListNode, listNodeToString


class Solution:
    def reverseList(self, head: ListNode) -> ListNode:
        res = ListNode(0)
        p = head
        while head:
            head = head.next
            p.next = res.next
            res.next = p
            p = head
        return res.next



if __name__ == '__main__':
    nums = "1,2,3,4,5"
    head = stringToListNode(nums)
    sol = Solution()
    result = sol.reverseList(head)
    print(listNodeToString(result))
Example #7
0
输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有6个节点,从头节点开始,它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个节点是值为4的节点。

 

示例:

给定一个链表: 1->2->3->4->5, 和 k = 2.

返回链表 4->5.
'''
from LinkList import ListNode, stringToListNode, listNodeToString


class Solution:
    def getKthFromEnd(self, head: ListNode, k: int) -> ListNode:
        fast = head
        for _ in range(k):
            fast = fast.next
        while fast:
            head = head.next
            fast = fast.next
        return head


if __name__ == '__main__':
    nums = "1,2,3,4,5"
    k = 2
    head = stringToListNode(nums)
    sol = Solution()
    print(listNodeToString(sol.getKthFromEnd(head, k)))
Example #8
0
给定的 n 保证是有效的。

进阶:

你能尝试使用一趟扫描实现吗?
'''
from LinkList import ListNode, stringToListNode, listNodeToString


class Solution:
    def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode:
        dumpy = ListNode(0)
        dumpy.next = head
        p = dumpy
        for _ in range(n):
            head = head.next
        while head:
            head = head.next
            p = p.next
        p.next = p.next.next
        return dumpy.next


if __name__ == '__main__':
    nums = "1"
    n = 1
    head = stringToListNode(nums)
    sol = Solution()
    print(listNodeToString(sol.removeNthFromEnd(head, n)))
解释: 给定你链表中值为 1 的第三个节点,那么在调用了你的函数之后,该链表应变为 4 -> 5 -> 9.
 

说明:

题目保证链表中节点的值互不相同
若使用 C 或 C++ 语言,你不需要 free 或 delete 被删除的节点
'''
from LinkList import listNodeToString, stringToListNode, ListNode


class Solution:
    def deleteNode(self, head: ListNode, val: int) -> ListNode:
        dumpy = ListNode(0)
        dumpy.next = head
        p = dumpy
        while p.next:
            if p.next.val == val:
                p.next = p.next.next
                break
            p = p.next
        return dumpy.next


if __name__ == '__main__':
    nums = '4,5,1,9'
    val = 5
    head = stringToListNode(nums)
    sol = Solution()
    print(listNodeToString(sol.deleteNode(head, val)))
Example #10
0
注意,我们返回了一个 ListNode 类型的对象 ans,这样:
ans.val = 3, ans.next.val = 4, ans.next.next.val = 5, 以及 ans.next.next.next = NULL.
示例 2:

输入:[1,2,3,4,5,6]
输出:此列表中的结点 4 (序列化形式:[4,5,6])
由于该列表有两个中间结点,值分别为 3 和 4,我们返回第二个结点。
 

提示:

给定链表的结点数介于 1 和 100 之间。
'''
from LinkList import ListNode, stringToListNode, listNodeToString


class Solution:
    def middleNode(self, head: ListNode) -> ListNode:
        slow, fast = head, head
        while fast and fast.next:
            slow = slow.next
            fast = fast.next.next
        return slow


if __name__ == '__main__':
    nums = "1,2,3,4,5"
    head = stringToListNode(nums)
    sol = Solution()
    print(listNodeToString(sol.middleNode(head)))
Example #11
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)))