重新排序

1、题目

在这里插入图片描述

2、解题1

申请空间解法

package main
import . "nc_tools"
/*
 * type ListNode struct{
 *   Val int
 *   Next *ListNode
 * }
 */

/**
 * 
 * @param head ListNode类 
 * @return void
*/
func reorderList( head *ListNode )  {
    // write code here
    if head == nil{
        return
    }
    var stk []*ListNode
    var tmp *ListNode
    tmp = head
    for tmp != nil{
        tmp2 := tmp.Next
        tmp.Next = nil
        stk = append(stk, tmp)
        tmp = tmp2
    }
    i := len(stk)-1
    j := 0
    for j<i{
        stk[j].Next = stk[i]
        if j+1 == i{
            break
        }
        stk[i].Next = stk[j+1]
        i--
        j++
    }
    head = stk[0]
    return
}

3、解题2

不申请空间解法

package main
import . "nc_tools"
/*
 * type ListNode struct{
 *   Val int
 *   Next *ListNode
 * }
 */

/**
 * 
 * @param head ListNode类 
 * @return void
*/
func reorderList( head *ListNode )  {
    // write code here
    if head == nil{
        return
    }
    //获取长度
    nodeLen := 0
    tmp := head
    for tmp != nil{
        nodeLen++
        tmp = tmp.Next
    }
    //截断
    tmp = head
    for i:= 0;i< (nodeLen-1)/2;i++{
        tmp = tmp.Next
    }
    head1 := head
    head2 := tmp.Next
    tmp.Next = nil
    //翻转
    var first *ListNode
    var second *ListNode
    var third *ListNode
    first = nil
    second = head2
    for second != nil{
        third = second.Next
        second.Next = first
        first = second
        second = third
    }
    //合并
    head2 = first
    for head1 != nil && head2 != nil{
        tmp = head1.Next
        tmp2 := head2.Next
        head1.Next = head2
        head2.Next = tmp
        head1 = tmp
        head2 = tmp2
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值