题目
题解
思路挺清晰,但是一到写代码就写不对啊o(╥﹏╥)o
这回卡在链表反转这儿了,记得拿下来后半部分以后 断链啊断链!
- 找中点(快慢指针)
- 后半部分反转(链表反转)
- 前后两部分链表合并
class Solution {
public void reorderList(ListNode head) {
//slow最后到中点的前一个结点(为了后面断链,所以不能是中点那个结点)
ListNode slow=head,fast=head;
while(fast.next!=null&&fast.next.next!=null){
slow=slow.next;
fast=fast.next.next;
}
fast=head;
ListNode lastHalf=slow.next;
slow.next=null;//之前bug就是卡在这儿了,反转前记得*断链*
//后半部分反转
lastHalf=reverse(lastHalf);
//两部分链表合并
while(fast!=null&&lastHalf!=null){
ListNode p=lastHalf.next;
ListNode q=fast.next;
lastHalf.next=q;
fast.next=lastHalf;
lastHalf=p;
fast=q;
}
}
//链表反转
public ListNode reverse(ListNode head){
ListNode pre=null,curr=head;
while(curr!=null){
ListNode r=curr.next;
curr.next=pre;
pre=curr;
curr=r;
}
return pre;
}
}
时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( 1 ) O(1) O(1)
方法二:将链表的各个结点装进线性表List,然后按规定顺序再把链表穿起来,空间复杂度为O(n),不如方法一,就不写了