【leetcode每日一题】Reorder List
2015-09-01 14:37
381 查看
题目:
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)合并两个链表。
代码如下:
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}.
解析:先将链表的后半部分反序,得到一个新链表。再把两个链表合并即可。步骤如下:
1)声明两个指针,快指针和慢指针,得到链表中间节点。
2)对链表后半部分进行逆序。
3)合并两个链表。
代码如下:
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: ListNode* reverse(ListNode *head) { if(head==NULL||head->next==NULL) return head; ListNode *p1=head,*p2=head->next,*p3; while(p2!=NULL) { p3=p2->next; p2->next=p1; p1=p2; p2=p3; } head->next=NULL; return p1; } ListNode* findMiddle(ListNode *head) { if(head==NULL||head->next==NULL) return head; ListNode *fast=head,*slow=head,*temp; while(fast!=NULL&&fast->next!=NULL) { fast=fast->next->next; slow=slow->next; } temp=slow->next; slow->next=NULL; return temp; } void reorderList(ListNode *head) { if(head==NULL||head->next==NULL) return; ListNode *pre=head; ListNode *tail=findMiddle(head); ListNode *post=reverse(tail); ListNode *temp1,*temp2; while(pre!=NULL&&post!=NULL) { temp1=pre->next; temp2=post->next; pre->next=post; post->next=temp1; pre=temp1; post=temp2; } } };
相关文章推荐
- [240] Search a 2D Matrix II
- 不同时间粒度下的数据处理action
- mysql将字符串替换为指定内容
- linux运维实战练习-2015年8月30日课程作业(练习)安排
- SharePoint Server 2016 IT Preview 先睹为快
- 【前端】CSS雪碧
- thinkphp模型层Model、Logic、Service讲解
- unity开发shader中要用到的内置状态变量
- Llinux+ROS+OpenCV开发环境配置笔记
- TextView知识点
- 浙江大学PAT_甲级_1029. Median (25)
- 1099. Build A Binary Search Tree (30)
- oracle获取时间
- js数据类型
- javascript实现父子页面数据传递
- i=i++的细节
- 读取本地文件
- 自己对于MVC开发模式的理解-2
- SolrCloud 4.3.1+Tomcat 7安装配置实践
- 友盟分享SDK编译错误