您的位置:首页 > 其它

LeetCode 148. Sort List--O(nlogn)时间复杂度和常数空间复杂度给链表排序

2017-08-06 20:33 459 查看
Sort a linked list in O(n log n)
time using constant space complexity.

package com.main;

class ListNode {
int val;
ListNode next;

ListNode(int x) {
val = x;
}
}

public class Main {
public ListNode sortList(ListNode head) {
if (head == null || head.next == null) {
return head;
}
//平分结点,分成两个分支
ListNode cur = null, slow = head, fast = head;
while (fast != null && fast.next != null) {//如果是奇数个结点,多出来的一个结点放在了后面的部分
cur = slow;
slow = slow.next;
fast = fast.next.next;
}
cur.next = null;
//每个分支都要排序,然后按序合并
ListNode l1 = sortList(head);
ListNode l2 = sortList(slow);
//按序合并,子分支和大分支都在这里合并
return merge(l1, l2);
}//sortList

public ListNode merge(ListNode l1, ListNode l2) {
ListNode res = new ListNode(0), p = res;
while (l1 != null && l2 != null) {
if (l1.val < l2.val) {
res.val = l1.val;
p.next = l1;//这一句别忘了
l1 = l1.next;
} else {
res.val = l2.val;
p.next = l2;
l2 = l2.next;
}
p = p.next;
}//while

if (l1 != null) {
p.next = l1;
}
if (l2 != null) {
//            p.next = l2.next;不能是p.next = l2.next
p.next = l2;
}
return res.next;// ListNode res = new ListNode(0)因为第一个结点是0,所以这里是 res.next,而不是res
}//merge

public static void main(String[] args) {
ListNode A = new ListNode(6);
A.next = new ListNode(2);
A.next.next = new ListNode(4);
A.next.next.next = new ListNode(3);
A.next.next.next.next = new ListNode(5);

Main main = new Main();
ListNode C = main.sortList(A);
System.out.println(C);
}
}







以下为递归执行流程,分别是2个结点和4个结点的情况



15 / 15 test cases passed.

Status: Accepted

Runtime: 8 ms

T(n) = O(nlogn) 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  LeetCode Sort List