LeetCode 92. 反转链表 II

avatar
作者
猴君
阅读量:2

LeetCode 92. 反转链表 II

给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。
示例 1:
输入:head = [1,2,3,4,5], left = 2, right = 4
输出:[1,4,3,2,5]
示例 2:
输入:head = [5], left = 1, right = 1
输出:[5]
提示:
链表中节点数目为 n
1 <= n <= 500
-500 <= Node.val <= 500
1 <= left <= right <= n
进阶: 你可以使用一趟扫描完成反转吗?

# Definition for singly-linked list. # class ListNode: #     def __init__(self, val=0, next=None): #         self.val = val #         self.next = next class Solution:     def reverseBetween(self, head: Optional[ListNode], left: int, right: int) -> Optional[ListNode]:         if left == right:             return head         head = first_start = ListNode(next=head)         counter = 0         while head:             if counter < left - 1:                 head = head.next             elif counter == left - 1:                 first_end = head                 head = head.next             elif counter == left:                 second_start = head                 pre = head                 head = head.next             elif counter < right:                 tmp = head.next                 head.next = pre                 pre = head                 head = tmp             elif counter == right:                 second_end = head                 third_start = head.next                 head.next = pre                 pre = None                 # 拼接                 first_end.next = second_end                 second_start.next = third_start                 return first_start.next             else:                 break             counter += 1 

时间复杂度 O(n):一个大循环最多遍历链表完整一次,计O(n)。共O(n)。
空间复杂度 O(1):常量。共 O(1)。

还是官解写的简洁

class Solution:     def reverseBetween(self, head: ListNode, left: int, right: int) -> ListNode:         # 设置 dummyNode 是这一类问题的一般做法         dummy_node = ListNode(-1)         dummy_node.next = head         pre = dummy_node         for _ in range(left - 1):             pre = pre.next          cur = pre.next         for _ in range(right - left):             next = cur.next             cur.next = next.next             next.next = pre.next             pre.next = next         return dummy_node.next  # 作者:力扣官方题解 # 链接:https://leetcode.cn/problems/reverse-linked-list-ii/solutions/634701/fan-zhuan-lian-biao-ii-by-leetcode-solut-teyq/ # 来源:力扣(LeetCode) # 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!