题解 | #重排链表# C++O(1)空间 递归写法

重排链表

http://www.nowcoder.com/practice/3d281dc0b3704347846a110bf561ef6b

思路其实挺简单的.

我们需要将头结点率先链接至尾节点.并且为了可持续性地将tail = tail -> pre.

在O(1)空间的情况下,使用递归是最好的选择.

使用一个全局变量保存为当前链的起始头部.而递归则是最先处理最尾部的节点

//这里我们只考虑最后一个节点5,是如何被放入头结点的.
/*
 此时的状态:
 		root->{1,2,3,4,5}
        tmp->{2,3,4,5}
        now->{4,5}
*/
root->next = now->next
/*
 此时的状态:
 		root->{1,5}
        tmp->{2,3,4,5}
        now->{4,5}
*/
root->next->next = tmp
/*
 此时的状态:
 		root->{1,5,2,3,4,5,2,3,4,5,2,3,4,5,...}
        tmp->{2,3,4,5,2,3,4,5,2,3,4,5,...}
        now->{4,5,2,3,4,5,2,3,4,5,...}
//可见,不将4,5断开后患无穷.
*/
now->next = nullptr;
/*
 此时的状态:
 		root->{1,5,2,3,4}
        tmp->{2,3,4}
        now->{4}
*/
root = tmp;
/*
此时的状态:
 		root->{2,3,4}
        tmp->{2,3,4}
        now->{4}
那么下一次运行时最尾端的节点就是 4,起始点就是2了
*/
//


class Solution {
public:
    ListNode* root;
    int len=0;
    void dfs(ListNode *now,int pos)
    {
        //用于记录总长度.
        len++;
        if(now->next==nullptr)return;
        //先让程序跑到最终点
        dfs(now->next,pos+2);
        //如果现在属于链表的前一半则不需要交换
        if(pos<len)return;
        auto tmp = root->next;
        root->next=now->next;
        root->next->next=tmp;
        now->next = nullptr;
        root=tmp;
    }
    
    void reorderList(ListNode *head) {
        if(head==nullptr)return ;
        root = head;
        dfs(head,1);
    }
};
全部评论
emmmmmm,可是这个运行的时候占内存还挺多的
点赞 回复 分享
发布于 2022-09-08 18:21 广东

相关推荐

03-26 13:04
已编辑
电子科技大学 算法工程师
xiaowl:你这个简历“条目上”都比较有深度性,但是实际上面试官又没法很好的评估你是怎么达到很多看上去很厉害的结果的。要避免一些看上去很厉害的包装,比如高效的内存复用策略的表达,如果仅是简单的一些内存共享机制,而且面试上也没有深挖的空间,就不要这样表达。比如,工程化模式本质上可能就是定义了一些abstract class,那也就没特别多值得讲的内容。建议简历上应该侧重那些你花了大量时间和精力解决、研究的问题,不要过分追求“丰富”,而是关注在技术深入度、问题解决能力的表现上。
没有实习经历,还有机会进...
点赞 评论 收藏
分享
04-15 13:42
四川大学 Java
蹲蹲offerrr:快投吧,有点晚现在
点赞 评论 收藏
分享
评论
4
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务