题解 | #两两交换链表的节点#

两两交换链表的节点

http://www.nowcoder.com/practice/71f95c23810349f782a1aa6c9bd714b4

两两交换链表的节点

题意

给一个链表,两个两个的实际的交换节点

方法

每两个一处理

分析

既然是两两交换,那么当我们把前两个处理完以后,后面剩余的部分可以递归用同样的方法处理

所以每次把第二个作为新的根,指向第一个节点

而第一个节点指向 递归后面的节点

代码

/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 *	ListNode(int x) : val(x), next(nullptr) {}
 * };
 */
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param head ListNode类 
     * @return ListNode类
     */
    ListNode* swapLinkedPair(ListNode* head) {
        if(head == NULL)return NULL; // 本身是空
        if(head->next == NULL) return head; // 奇数个
		// head r r1 => r head r1
        ListNode* r = head->next; // 新的根
        ListNode* r1 = head->next->next; // 三个往后
        r->next = head; // 指向第一个
        head->next = swapLinkedPair(r1); // 第一个指向递归
        return r;
    }
};

复杂度分析

空间复杂度: 主要和递归深度相关,空间复杂度为O(n)O(n)

时间复杂度: 对于每两个节点,操作代价为常数,所以总时间复杂度为O(n)O(n)

转换成数组再处理

分析

先把链表转换成数组

再两两一对改造指向每个

对于每两个一组,后一个直接指向前一个,而前一个应该指向下一组的起始,根据下一组个数是0,1,2处理各不相同

最后输出链,也需要注意根据节点是1个还是大于1个起始点有不同

样例

以样例数据为例

alt

代码

/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 *	ListNode(int x) : val(x), next(nullptr) {}
 * };
 */
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param head ListNode类 
     * @return ListNode类
     */
    ListNode* swapLinkedPair(ListNode* head) {
        if(head == NULL)return NULL;
        vector<ListNode*> nodes; // 转化成数组
        ListNode* p = head;
        while(p){
            nodes.push_back(p);
            p = p->next;
        }
        for(int i = 0;i < nodes.size();i++){
            if(i%2 == 0){ // 两个一组的前一个
                if(i + 3 < nodes.size()){ // 后面有不少于2个点
                    nodes[i]-> next = nodes[i+3];
                }else if(i + 2 < nodes.size()){ // 后面仅有一个点
                    nodes[i]-> next = nodes[i+2];
                }else{ // 这就是结尾
                    nodes[i]-> next = NULL;
                }
            }else{ // 两个一组的后一个
                nodes[i] -> next = nodes[i-1];
            }
        }
        return nodes.size() > 1 ? nodes[1]:nodes[0]; // 起始节点不同
    }
};

复杂度分析

空间复杂度: 主要消耗在转化出的数组,空间复杂度为O(n)O(n)

时间复杂度: 对于每个节点操作代价为常数,所以总时间复杂度为O(n)O(n)

全部评论

相关推荐

今天 16:14
已编辑
西安邮电大学 golang
不止遇到一次了,什么都不会,让提合并请求,问什么是合并请求。让gitlab.页面把测试截图附上,不知道截图要放在哪,那么大的编辑看不到吗让配开发机,问ip是什么东西……这都咋进来的啊,我们(我2023年毕业)那会儿没AI的时候面试都是直接linux,docker,k8s,git,结构与算法,计网。怎么才过去2年,实习生跟傻子一样,有些问题问的我难受,不会git&nbsp;commit,不会git&nbsp;pull,不会切换分支,直接要覆盖master....————而且态度非常敷衍,3天前给开个仓库权限,连本地都没有拉下来。让写一个小文档,都是说一句,写一句,说把目录加上,挺嗤之以鼻,最后还是把目录加上了😂😂任何文档和注释都是方便后来人的,现在的人真的很自负啊,打开github看看任何一个开源项目的文档和注释,都写的很详细。难道现在的同学在校期间不经常拉开源项目看源码学习吗?&nbsp;哪怕是一个swap函数,开源项目里都经常注释:1&nbsp;3&nbsp;5&nbsp;7&nbsp;9&nbsp;2&nbsp;4&nbsp;6&nbsp;8&nbsp;10^&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;^l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rswap:{功能描述}{使用样例}————给我气笑了,没次问我有什么任务的时候,我都是说,优先你学校导师的项目,然后再做公司需求。然后给了两个需求,一个月内搞定就行,既然是agent开发,1.&nbsp;部署需要维护项目的开发环境2.阅读opencode/openclaude代码(我个人感觉龙虾的源码agent部分很常规,就一个channel+agent,还不如看claude泄露的代码和opencode)然后任务1搞了几周说因为环境问题,他申请到的远程开发机是linux,装的python2,项目是py3的,所以没搭建,我说你不行就用conda或docker把环境屏蔽了呢,没搭理我。任务2:看了很长时间代码,给我回了一句,opencode和openclaude是用go写的……我说你打开github看右下角那的语言是ts还是go……&nbsp;结果满脸懵的说ts是什么……我让看agent&nbsp;loop,哪怕全局搜索一下while(true),跳过去从头看到尾就大致清楚了,压根没看。————嘻嘻,我已经开始做社招简历了。
redf1sh:默认会git结果发现真不会,这种一看就是没做过项目的,真做过项目的至少会提交
点赞 评论 收藏
分享
04-15 14:28
已编辑
Java
程序员小白条:学院+两段经典项目+技术栈,最大众的简历,纯看运气
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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