92. 反转链表 II

反转链表 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

进阶: 你可以使用一趟扫描完成反转吗?

思路:

时间复杂度:O(n),空间复杂度O(1)

开头增加一个head2,就可以不讨论left是不是1的情况

代码:

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func reverseBetween(head *ListNode, left int, right int) *ListNode {
    if left == right{
        return head
    }
    head2 := new(ListNode)
    head2.Next = head
    left++
    right++
    var pre1,pre2,next1,next2 *ListNode
    tmp := head2
    for i:=0;i<right;i++{
        if i == left-2{
            pre1 = tmp
            pre2 = tmp.Next
        }else if i== right-1{
            next1 = tmp
        }
        tmp = tmp.Next
    }
    next2 = tmp
    pre1.Next = nil
    next1.Next = nil
    next := merge(pre2)
    pre1.Next = next
    for next.Next != nil{
        next = next.Next
    }
    next.Next = next2
    return head2.Next
}

func merge(head *ListNode)*ListNode{
    var head2 *ListNode
    for head != nil{
        
        tmp := head.Next
        head.Next = head2
        head2 = head
        head = tmp
    }
    return head2
}

代码效率:

执行用时:0 ms, 在所有 Go 提交中击败了100.00%的用户
内存消耗:2 MB, 在所有 Go 提交中击败了73.90%的用户


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!