leetcode143- Reorder List问题

题目要求:

    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.

 

思路:

  初看到这个题目,只是提出了空间复杂度的要求,并没有提出时间复杂度要求,因此我开始的思路比较简单。

  首先固定一个位置指针,指示每次要插入的位置;

  查找链表的最后一个结点;

  将链表的最后一个结点插入到指示位置;

  位置指针下移一步。

  结束条件是:进行了链表长度的1/2次

 

该种思路运行结果正确,但是超时了。。。。

好坑啊,你也没要提示我时间复杂度啊

 

思路2:

  考虑到时间复杂度的问题,又采取了另外一种思路。

  首先使用快慢指针,找到链表的中心;

  将链表的后半部分进行逆序;

  逆序完成后,将后半部分依次插入到指定位置。

  该种方法时间复杂度为O(n),空间复杂度为O(1)

代码:

  

public static void reorderList(ListNode head){
if(head == null || head.next == null || head.next.next == null){
return;
}else{
ListNode ptr = head, curptr = null, fast = null, slow = null;
int len = 0; //记录链表长度
while(ptr != null){
len++;
ptr = ptr.next;
}

//slow指针走到链表中心
slow = head;
fast = head;
while(fast != null && fast.next != null){
slow = slow.next;
fast = fast.next.next;
}

//查找链表中心的前一个元素
ListNode ptr1 = head, ptr2 = slow;
while(ptr1.next != slow){
ptr1 = ptr1.next;
}
//后半部分链表逆序
if(len%2 == 0){
//偶数个元素
fast = slow.next;
for(int i = 0; i < len/2-1; i++){
ptr = fast.next;
fast.next = slow;
slow = fast;
fast = ptr;
}
ptr1.next = null;
ptr2.next = null;

//偶数个元素的链表逆序完成后依次插入
curptr = head;
ListNode ptr3 = null;
for(int i=0; i<len/2; i++){
ptr = curptr.next;
curptr.next = slow;
ptr3 = slow.next;
slow.next = ptr;
curptr = ptr;
slow = ptr3;
}
}else{
//奇数个元素
slow = slow.next;
ptr1 = slow;
fast = slow.next;
for(int i= 0; i < len/2-1;i++){
ptr = fast.next;
fast.next = slow;
slow = fast;
fast = ptr;
}
ptr2.next = null;
ptr1.next = null;

//奇数个元素逆序后依次插入元素
curptr = head;
ListNode ptr3 = null;
for(int i = 0; i < len/2; i++){
ptr = curptr.next;
curptr.next = slow;
ptr3 = slow.next;
slow.next = ptr;
curptr = ptr;
slow = ptr3;
}
}

}
}

 

posted @ 2016-05-28 11:59  沧浪少年  阅读(915)  评论(0编辑  收藏  举报