Leetcode 92. Reverse Linked List II
Description: Reverse a linked list from position m to n. Do it in one-pass. Note: 1 ≤ m ≤ n ≤ length of list.
Link: https://leetcode.com/problems/reverse-linked-list-ii/
Examples:
Example: Input: 1->2->3->4->5->NULL, m = 2, n = 4 Output: 1->4->3->2->5->NULL
思路: 206. Reverse Linked List 相比,需要找到第m-1, n+1节点,将m-n之间的reverse,head-m-1 重新连接 reversed list,再连n+1到结尾就可以了。当m=1时,m-1就是不合法的节点,所以要特殊考虑这种情况。
# Definition for singly-linked list. # class ListNode(object): # def __init__(self, val=0, next=None): # self.val = val # self.next = next class Solution(object): def reverseBetween(self, head, m, n): """ :type head: ListNode :type m: int :type n: int :rtype: ListNode """ if not head: return head if not head.next: return head if m == n: return head if m == 1: p = head q = p.next p.next = None length = 1 while q: f = q.next q.next = p p = q q = f length += 1 if length == n: break head.next = q return p else: pre = head p = head.next length = 2 # p is the second node, so length start by 2 while p: if length == m: rvs_head = p # rvs_head is m Node before reverse, afterwards be n Node end = pre # end is the m-1 Node break pre = p p = p.next length += 1 q = p.next length += 1 # now q is the moving node, and q=p.next make length plus 1 p.next = None while q and length <= n: f = q.next q.next = p p = q q = f length += 1 end.next = p # p is the head of reversed linked list rvs_head.next = q # q is the head of list begin by n+1 Node return head
显然,这个代码太长了,有明显的冗余,症结在于m-1不合法,那不妨在head前加root节点,即使m=1,m-1可以指向root. 但是下面这个代码,时间和空间都占用更多。
# Definition for singly-linked list. # class ListNode(object): # def __init__(self, val=0, next=None): # self.val = val # self.next = next class Solution(object): def reverseBetween(self, head, m, n): """ :type head: ListNode :type m: int :type n: int :rtype: ListNode """ if not head: return head if not head.next: return head if m == n: return head root = ListNode(0) root.next = head pre = root p = root.next length = 1 while p: if length == m: rvs_head = p end = pre break pre = p p = p.next length += 1 q = p.next length += 1 p.next = None while q and length <= n: f = q.next q.next = p p = q q = f length += 1 end.next = p rvs_head.next = q return root.next
日期: 2020-11-20 今天很充实,很开心