题目
143. 重排链表【中等】
题解
思路挺清晰,但是一到写代码就写不对啊o(╥﹏╥)o 这回卡在链表反转这儿了,记得拿下来后半部分以后 断链啊断链!
- 找中点(快慢指针)
- 后半部分反转(链表反转)
- 前后两部分链表合并
class Solution {
public void reorderList(ListNode head) {
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;
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),不如方法一,就不写了
|