题目

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}.

代码

/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
void reorderList(ListNode *head) {
if (!head) return;
ListNode dummy(-);
dummy.next = head;
ListNode *p1 = &dummy, *p2 = &dummy;
// get the mid Node
for (; p2 && p2->next; p1 = p1->next, p2 = p2->next->next);
// reverse the second half list
for ( ListNode *prev = p1, *curr = p1->next; curr && curr->next; ){
ListNode *tmp = curr->next;
curr->next = curr->next->next;
tmp->next = prev->next;
prev->next = tmp;
}
// cut the list from mid and merge two list
for ( p2 = p1->next, p1->next = NULL,p1 = head; p2; ){
ListNode *tmp = p1->next;
p1->next = p2;
p2 = p2->next;
p1->next->next = tmp;
p1 = tmp;
}
}
};

Tips

改了两次,终于AC的效率进入5%了。

算法的思路:

Step1. 找到中间节点(p1指向中间节点之前的节点)

Step2. 把后半个List进行reverse操作

Step3. 讲两个Lists进行merge操作

尽量减少循环体中的无谓语句(例如条件判断语句、赋值语句、开新的中间变量),这样可以提升程序效率。

===========================================

第二次过这道题,考察三个内容

(1)双指针找链表中点

(2)翻转链表

(3)合并链表

合并链表的部分不太熟练,虽然自己也写出来了AC的代码,但是有些丑陋。复习了之前的代码,把这三部分都完善了一下。

/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
void reorderList(ListNode* head) {
ListNode dummpy(-);
dummpy.next = head;
// find mid ListNode
ListNode* p1 = &dummpy;
ListNode* p2 = &dummpy;
while ( p2 && p2->next )
{
p1 = p1->next;
p2 = p2->next->next;
}
// reverse the second
ListNode* second = p1->next;
p1->next = NULL;
ListNode dummpy2(-);
dummpy2.next = second;
ListNode* curr = second;
while ( curr && curr->next )
{
ListNode* tmp = curr->next;
curr->next = tmp->next;
tmp->next = dummpy2.next;
dummpy2.next = tmp;
}
// merge two sub lists
p1 = dummpy.next;
p2 = dummpy2.next;
while ( p2 )
{
ListNode* tmp = p1->next;
p1->next = p2;
p2 = p2->next;
p1->next->next = tmp;
p1 = tmp;
}
}
};

【Reorder List】cpp的更多相关文章

  1. hdu 4739【位运算】.cpp

    题意: 给出n个地雷所在位置,正好能够组成正方形的地雷就可以拿走..为了简化题目,只考虑平行于横轴的正方形.. 问最多可以拿走多少个正方形.. 思路: 先找出可以组成正方形的地雷组合cnt个.. 然后 ...

  2. Hdu 4734 【数位DP】.cpp

    题意: 我们定义十进制数x的权值为f(x) = a(n)*2^(n-1)+a(n-1)*2(n-2)+...a(2)*2+a(1)*1,a(i)表示十进制数x中第i位的数字. 题目给出a,b,求出0~ ...

  3. leetcode 【 Reorder List 】python 实现

    题目: Given a singly linked list L: L0→L1→…→Ln-1→Ln,reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→… You must do ...

  4. 【Valid Sudoku】cpp

    题目: Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules. The Sudoku board could ...

  5. 【Permutations II】cpp

    题目: Given a collection of numbers that might contain duplicates, return all possible unique permutat ...

  6. 【Subsets II】cpp

    题目: Given a collection of integers that might contain duplicates, nums, return all possible subsets. ...

  7. 【Sort Colors】cpp

    题目: Given an array with n objects colored red, white or blue, sort them so that objects of the same ...

  8. 【Sort List】cpp

    题目: Sort a linked list in O(n log n) time using constant space complexity. 代码: /** * Definition for ...

  9. 【Path Sum】cpp

    题目: Given a binary tree and a sum, determine if the tree has a root-to-leaf path such that adding up ...

随机推荐

  1. 音乐社交APP源码 V1.1

    1.关于音乐曲库,对接的是百度音乐,会自动随搜索链接百度曲库2.便捷聊天,采用xmpp基本架构.3.加入和整理了群聊天.4.分布式聊天,喜欢该专辑直接进入聊天,喜欢该音乐的进入聊天.5.采用兴趣社交和 ...

  2. 【风马一族_mysql】MySQL免安装版环境配置图文教程

    mysql存放在某一个磁盘中(笔者使用E盘) 配置系统变量 打开 电脑的属性 点击 高级系统设置 选择 高级 点击 环境变量 选择 系统变量 点击 变量Path,追加 值 E:\mysql-5.6.2 ...

  3. ChainOfResponsibility

    #include <iostream> using namespace std; class Chain { public: bool Handle() { return false; } ...

  4. 14种网页图片和文字特效的jQuery插件代码

    1.网页图片3d旋转jQuery代码 演示和下载地址 2.存css3实现的tabl选项卡代码 演示和下载地址 3.jQuery标签旋转代码 演示和下载地址 4.鼠标悬浮的图片选项卡代码 演示和下载地址 ...

  5. POJ C程序设计进阶 编程题#4:括号匹配问题

    编程题#4:扩号匹配问题 来源: POJ(Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩.) 注意: 总时间限制: 1000ms 内存限制: 65536kB 描述 在某 ...

  6. POJ C程序设计进阶 编程题#1:寻找下标

    编程题#1:寻找下标 来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩.) 注意: 总时间限制: 1000ms 内存限制: 65536kB 描述 已知一 ...

  7. Thinkphp 下面执行crond

    thinkphp开启cli支持  1.tp正好支持cli命令模式,手册的路径为13.7.4 如果是用的其他框架不支持cli,那么只能直接写程序了,其实就是写面向过程的最基础的php代码. 2.在入口文 ...

  8. PopupWindow的简单使用

    测试代码: package com.zzw.testpopuwindows; import android.app.Activity; import android.graphics.Color; i ...

  9. 添加TextView隐藏进度条的方法

    在TextView中添加 android:scrollbars="vertical" android:singleLine="false" 在Activity代 ...

  10. C语言-L Buffer is too small && 0 解决方法

    问题如下: 问题出在程序语句(见下): 其中,字符串p1和p2分别指向某个字符串,p是定义的一个字符数组.问题出现在对strlen()的使用,这个函数计算的字符串长度是不包括'\0'的,所以在设置第二 ...