博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【leetcode】Reorder List (middle)
阅读量:6036 次
发布时间:2019-06-20

本文共 2045 字,大约阅读时间需要 6 分钟。

Given a singly linked list LL0→L1→…→Ln-1→Ln,

reorder it to: L0→LnL1→Ln-1→L2→Ln-2→…

You must do this in-place without altering the nodes' values.

For example,

Given {1,2,3,4}, reorder it to {1,4,2,3}.

 

思路:

先把链表分成两节,后半部分翻转,然后前后交叉连接。

大神的代码比我的简洁,注意分两节时用快慢指针。

大神巧妙的在最后一步融合时用了连等号

在翻转部分:大神翻转过的部分的结尾是null. 而我的方法是把结尾连接下一个待翻转的结点。

// O(N) time, O(1) space in totalvoid reorderList(ListNode *head) {    if (!head || !head->next) return;    // find the middle node: O(n)    ListNode *p1 = head, *p2 = head->next;    while (p2 && p2->next) {        p1 = p1->next;        p2 = p2->next->next;    }    // cut from the middle and reverse the second half: O(n)    ListNode *head2 = p1->next;    p1->next = NULL;    p2 = head2->next;    head2->next = NULL;    while (p2) {        p1 = p2->next;        p2->next = head2;        head2 = p2;        p2 = p1;    }    // merge two lists: O(n)    for (p1 = head, p2 = head2; p1; ) {        auto t = p1->next;        p1 = p1->next = p2;        p2 = t;    }}

 

 

我的代码

void reorderList(ListNode *head) {        int len = 0; //链表长度        ListNode * p = head;        ListNode * latterpart = head;        //找链表长度        while(p != NULL)        {            len++;            p = p->next;        }        if(len <= 2)        {            return;        }        //把链表分成两份 如1 2 3 4 5 分成 1 2 3 和 4 5        len = (len + 1) / 2;  //一半的位置        p = head;        while(--len)        {            p = p->next;        }        latterpart = p->next;        p->next = NULL;        //翻转后半部分        ListNode * plast = latterpart;        while(plast->next != NULL)        {            p = plast->next;            plast->next = p->next;            p->next = latterpart;            latterpart = p; //更新头部 每次把后面的转到最前面去        }        //交叉前后两段        p = head;        while(p != NULL && latterpart != NULL) //如果前半部分和后半部分都还有可连接的 继续        {            ListNode * tmp = p->next;            p->next = latterpart;            latterpart = latterpart->next;            p->next->next = tmp;            p = p->next->next;        }        return;    }

 

转载地址:http://tylhx.baihongyu.com/

你可能感兴趣的文章
linux命令:samb文件共享服务器配置
查看>>
Docker容器引导完整CentOS
查看>>
CISCO 交换机,端口安全配置实例。
查看>>
我看51CTO
查看>>
nodeJS调用函数
查看>>
霍金李开复张亚勤等纵论AI:关于创造和毁灭、创业和机遇的碰撞
查看>>
新手理解类和对象
查看>>
Linux磁盘分区及文件系统管理之基础概念
查看>>
各浏览器CSS hack兼容表:
查看>>
H3C HWTACACS配置
查看>>
mezzanine安装(python2.7+nginx+mysql+supervisor)
查看>>
Supervisord 远程命令执行漏洞(CVE-2017-11610)
查看>>
Retrofit2.0+ .Net MVC4(WebApi) 上传多张图片
查看>>
oracle静默安装文件db_install.rsp详解
查看>>
Redis详解(一)
查看>>
mysqldump的一些用法
查看>>
在RHEL7或CentOS7中修改创建账号时系统默认UID、GID最小起始值及其他设置
查看>>
nginx 结合php 实现高级配置详解
查看>>
选择什么语言真的重要吗
查看>>
百度编辑器(ueditor)不支持上传图片到独立服务器?
查看>>