题目:
思想:
代码:
题目:
![](https://i-blog.csdnimg.cn/blog_migrate/3b196d9fc00391673a551ad7740f42c5.png)
思想:
- 先将链表的拆成奇数位和偶数位两条链表,时间复杂度O(n);
- 再将偶数位链表进行反转,时间复杂度O(n);
- 最后归并两个升序的链表,时间复杂度O(n)。
代码:
public ListNode sortOod(ListNode head){
if(head==null||head.next==null) return head;
//1.拆分
ListNode oddHead = head,evenHead = head.next;
ListNode oddCur = head,evenCur = head.next;
ListNode cur = head;
while(evenCur!=null){
oddCur.next = evenCur.next;
oddCur = oddCur.next;
if(oddCur!=null){
evenCur.next = oddCur.next;
evenCur = evenCur.next;
}
}
//2.偶数位链表逆转
evenHead = reverseList(evenHead);
//3.合并两个升序的链表
return mergeLists(oddHead,evenHead);
}
public ListNode mergeLists(ListNode head1,ListNode head2){
ListNode dummy = new ListNode(-1);
ListNode cur = dummy;
while(head1!=null&&head2!=null){
if(head1.val<=head2.val){
cur.next = head1;
head1 = head1.next;
}else{
cur.next = head2;
head2 = head2.next;
}
cur = cur.next;
}
while(head1!=null){
cur.next=head1;
head1 = head1.next;
cur = cur.next;
}
while(head2!=null){
cur.next = head2;
head2 = head2.next;
cur = cur.next;
}
return dummy.next;
}
public ListNode reverseList(ListNode head){
if(head==null) return head;
ListNode pre = null;
ListNode cur = head;
while(cur!=null){
ListNode next= cur.next;
cur.next = pre;
pre = cur;
cur = next;
}
return pre;
}