LeetCode | Reorder List
来源:互联网 发布:python网络数据采集pdf 编辑:程序博客网 时间:2024/05/22 03:40
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}.
又是一个链表改序的问题,古老的办法当然是每次找最末尾,然后将最末尾插入到前面想要的位置。
然后发现一个很大很大的用例TLE了
//可以看到,暴力的办法超时了 for(ListNode* cur=head;i<n/2;i++){ //获取到最后一个节点 temp=cur; ListNode* t=temp->next; int count=1; //不能少于3个元素才能进行交换 for(;t->next!=NULL;t=t->next,temp=temp->next) count++; //得到t为最后一个节点 if(count<2) break; t->next=cur->next; cur->next=t; cur=cur->next->next; //找到temp前一个设置为队尾 temp->next=NULL; //break if(cur==NULL) break; }
正确的办法应当是算出后面有多少元素需要倒置,然后倒置它们,将这些链表提取出来依次插入另一个链表
处理一些莫名的re之后就可ac
class Solution {public: void reorderList(ListNode* head) { if(head==NULL) return; ListNode root(-1),new_head(-1); root.next=head; int n=1,i=0;//计算链表的长度 ListNode* temp=head; for(;temp->next!=NULL;n++,temp=temp->next); if(n<=2) return;//2个节点以内不需要进行处理 int k=(n-1)/2; //可以确定这个end是目的链表的end ListNode *end=head; for(int i=0;i<n/2;i++,end=end->next); //划分为两个链表 new_head.next=end->next; end->next=NULL; //反转第二链表 reverse(&new_head,new_head.next,temp); //将第二链表插入第一链表 for(ListNode *st=head,*sub=new_head.next,*stmp=NULL;sub;){ stmp=sub->next; sub->next=st->next; st->next=sub; st=sub->next; sub=stmp; } } ListNode* reverse(ListNode* preNode,ListNode* begin,ListNode* end){ //首尾是一个节点。不需要处理 if(begin==end) return begin; ListNode* end_next=end->next; for(ListNode *p=begin,*cur=p->next,*next=cur->next; cur != end_next; p=cur,cur=next,next=next?next->next:NULL){ cur->next=p; } begin->next=end_next; preNode->next=end; return begin; }};
0 0
- [leetcode][list] Reorder List
- [leetcode][list] Reorder List
- Leetcode: Reorder List
- [LeetCode] Reorder List
- LeetCode题解:Reorder List
- Leetcode: Reorder List
- LeetCode:Reorder List
- leetcode之Reorder List
- Leetcode: Reorder List
- [LeetCode]Reorder List
- [LeetCode] Reorder List
- leetcode Reorder List
- LeetCode | Reorder List
- LeetCode Reorder List
- LeetCode 之 Reorder List
- Leetcode: Reorder List
- LeetCode OJ:Reorder List
- Reorder List (LeetCode)
- 超链接
- HDU 3342 Legal or Not(拓扑排序)
- HDU 1080 加权LCS
- java BufferedWriter
- Java集合--自定义泛型实例
- LeetCode | Reorder List
- 浅谈tomcat配置
- java线程同步与通信
- mac 安装tornado
- CDOJ King's Sanctuary 几何
- 在ASP.NET MVC中使用WebApi注册路由注意事项
- hdu-1969-Pie
- Java实现九成九乘法表
- POJ 1062