📌  相关文章
📜  将最后M个节点附加到给定链表的开头(1)

📅  最后修改于: 2023-12-03 14:53:53.412000             🧑  作者: Mango

将最后M个节点附加到给定链表的开头

介绍

这是一个解决链表问题的算法,主要是将给定链表的最后M个节点附加到链表的开头。这个算法可以用来解决诸如链表反转、链表环问题等。

本文将为你介绍该算法的思路、实现和复杂度分析。

思路
  1. 先遍历一遍链表,记录链表长度n。
  2. 如果n <= M,则直接返回原链表,因为需要移动的节点数量大于等于链表长度。
  3. 如果n > M,则找到倒数第M+1个节点p。
  4. 将p的next指针指向原链表头节点head。
  5. 将原链表尾节点的next指针指向原链表头节点。
  6. 将p作为新的头节点返回。
实现
class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next

def move_last_m_to_head(head: ListNode, m: int) -> ListNode:
    if not head:
        return head

    # 计算链表长度
    length = 0
    node = head
    while node:
        length += 1
        node = node.next

    if length <= m:
        return head

    # 找到倒数第m+1个节点
    p = head
    for i in range(length - m - 1):
        p = p.next

    # 将p的next指针指向原链表头节点
    new_head = p.next

    # 将原链表尾节点的next指针指向原链表头节点
    tail = new_head
    while tail.next:
        tail = tail.next
    tail.next = head

    # 将p作为新的头节点返回
    p.next = None
    return new_head
复杂度分析
  • 时间复杂度:O(n),其中n为链表长度,需要遍历一遍链表。
  • 空间复杂度:O(1),只需要常数级别的额外空间。