Leetcode 148. Sort List
题目链接: Sort List
难度:Medium
题目大意:
输入一个链表,对链表进行排序。
思路:
先把链表一分为二,对两个子链表进行排序,然后再把两个排序后的子链表合并起来。对子链表依然可以用这种方法进行排序,直到链表只有一个元素。本文参考高赞回答
代码
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {//参考高赞回答
public ListNode sortList(ListNode head) {
if(head==null||head.next==null){
return head;
}
ListNode prev=null,slow=head,fast=head;
while(fast!=null&&fast.next!=null){
prev=slow;
slow=slow.next;
fast=fast.next.next;
}
prev.next=null;
ListNode l1=sortList(head);
ListNode l2=sortList(slow);
return merge(l1,l2);
}
ListNode merge(ListNode l1,ListNode l2){
ListNode l=new ListNode(0);
ListNode p=l;
while(l1!=null&&l2!=null){
if(l1.val<l2.val){
p.next=l1;
l1=l1.next;
}
else{
p.next=l2;
l2=l2.next;
}
p=p.next;
}
if(l1!=null){
p.next=l1;
}
if(l2!=null){
p.next=l2;
}
return l.next;
}
}