【Reorder List】cpp
题目:
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 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的更多相关文章
- hdu 4739【位运算】.cpp
题意: 给出n个地雷所在位置,正好能够组成正方形的地雷就可以拿走..为了简化题目,只考虑平行于横轴的正方形.. 问最多可以拿走多少个正方形.. 思路: 先找出可以组成正方形的地雷组合cnt个.. 然后 ...
- 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~ ...
- 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 ...
- 【Valid Sudoku】cpp
题目: Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules. The Sudoku board could ...
- 【Permutations II】cpp
题目: Given a collection of numbers that might contain duplicates, return all possible unique permutat ...
- 【Subsets II】cpp
题目: Given a collection of integers that might contain duplicates, nums, return all possible subsets. ...
- 【Sort Colors】cpp
题目: Given an array with n objects colored red, white or blue, sort them so that objects of the same ...
- 【Sort List】cpp
题目: Sort a linked list in O(n log n) time using constant space complexity. 代码: /** * Definition for ...
- 【Path Sum】cpp
题目: Given a binary tree and a sum, determine if the tree has a root-to-leaf path such that adding up ...
随机推荐
- leetcode1:在数组中找2个数的和正好等于一个给定值--哈希
package java_net_test; import java.util.HashMap; import java.util.Iterator; import java.util.Map; pu ...
- MyEclipse各种操作
MyEclipse console没有显示的解决方法 1.进window菜单 ->show view->console 2.还是window菜单->preferences-& ...
- C#中List〈string〉和string[]数组之间的相互转换
1,从System.String[]转到List<System.String> System.String[] str={"str","string" ...
- SQL SERVER连接字符串学习
在使用connection string时遇到一些问题 字符串如下"Data Source= ******;Initial Catalog=******;Persist Security I ...
- JS模块化工具requirejs教程(二):基本知识
基本API require会定义三个变量:define,require,requirejs,其中require === requirejs,一般使用require更简短 define 从名字就可以看出 ...
- MHA学习笔记
MHA是一款开源的MySQL高可用程序,为MySQL主从复制架构提供了节点故障转移功能,当 master发生故障时MHA会自动提升拥有最新数据的slave节点成为新的主节点,还提供了master节 点 ...
- JS中cookie的基本使用
cookie是本身是HTML中ducument中的一个属性,可以用来保存一些简单的数据信息,比如用户名.密码等,提高一些网站的用户体验度.下面就来简单的说说cookie,它有下面几个特性: 1.有过期 ...
- C# 多线程操作样例
using System; using System.Threading; //引用多线程 namespace ThreadTest { public class Alpha { public voi ...
- 从客户端检测到有潜在危险的Request.Form 值【转】
asp.net开发中,经常遇到“从客户端检测到有潜在危险的Request.Form 值”错误提示,很多人给出的解决方案是: 1.web.config文档<system.web>后面加入这一 ...
- Unity加入Android广告小结
在Unity游戏加入广告大致有以下几种方式: 导入Android Jar包 导出游戏为Android项目(在Build时选中Google Android Project,这种方法可以参考将Unity3 ...