题目的链接在这里:https://leetcode-cn.com/problems/sort-list/
题目大意
给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。一、示意图
二、解题思路
快慢指针和合并
快慢指针和合并
代码如下:
/**
* 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)
return null;
else{
return mergeSort(head);
}
}
private ListNode mergeSort(ListNode head) {
//这里也先进行一个边界判断
if(head.next==null)
return head;
//再进行中点判断
ListNode p=head,q=head,pre=null;
//再进行 快慢指针
//1 2 3 4
while (q!=null&&q.next!=null){
pre=p;
p=p.next;
q=q.next.next;
}
//中点出现了
//就让这个pre指向null 就行了
pre.next=null;
//然后递归调用
ListNode l=mergeSort(head);
ListNode r=mergeSort(p);
return Merge(l,r);
}
private ListNode Merge(ListNode l, ListNode r) {
//这里是进行合并操作
//先创建一个空节点
ListNode result=new ListNode(0);
ListNode temp=result;
//然后开始判断
//为什么不是 l.next呢。。 确实是不是等于l
// 1 2 3 4 5 这种情况
while (l!=null&&r!=null){
//然后开始判断
if(l.val<r.val){
//说明l比较小
temp.next=l;
l=l.next;
temp=temp.next;
}else{
//说明r比较小
temp.next=r;
r=r.next;
temp=temp.next;
}
}
//然后可能l或者r会存在一个不是null
while (l!=null){
temp.next=l;
l=l.next;
temp=temp.next;
}
while (r!=null){
temp.next=r;
r=r.next;
temp=temp.next;
}
//要排除第一个
return result.next;
}
}