您的位置:首页 > 其它

[LeetCode]Reorder List

2016-12-06 15:50 246 查看
Question

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

本题难度Medium。

快慢指针+链表合并

【复杂度】

时间 O(N) 空间 O(1)

【思路】

如果这道题目想要保证成功率我推荐用计数的办法,虽然复杂度高了点但是成功率高。

思路都是一样,先找到中间的节点(可以计数,也可以用快慢指针法),然后将该链表一分为2个子链表,将后面那个子链表reverse,然后合并这两个子链表。

【注意】

第18行是针对后面子链表没有的情况;

第20行是将最后的节点“屁股擦干净”。这里我是提前做了扫尾工作,因为23行后的循环结束了,cur1并不一定指向最后一个节点(比如 1->2->3->4)。

【代码】

/**
* Definition for singly-linked list.
* public class ListNode {
*     int val;
*     ListNode next;
*     ListNode(int x) { val = x; }
* }
*/
public class Solution {
public void reorderList(ListNode head) {
//require
ListNode slow=head,fast=head;
while(fast!=null&&fast.next!=null){
slow=slow.next;
fast=fast.next.next;
}
//如果后面那个子链表没有,那就没必要继续
if(slow==null||slow.next==null)return;
ListNode cur1=head,cur2=reverse(slow.next);
slow.next=null;     //这里的slow就是最终的节点
ListNode tmp=null;
//invariant:merge two lists
while(cur2!=null){
tmp=cur1.next;
cur1.next=cur2;
cur2=cur2.next;
cur1.next.next=tmp;
cur1=tmp;
}
}
private ListNode reverse(ListNode head){
ListNode prev=null,cur=head;
while(cur!=null){
ListNode next=cur.next;
cur.next=prev;
prev=cur;
cur=next;
}
return prev;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  leetcode