给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。
我的思路:采用归并排序,
找到链表的中点,以中点为分界,将链表拆分成两个子链表。寻找链表的中点可以使用快慢指针的做法,快指针每次移动 2 步,慢指针每次移动 1 步,当快指针到达链表末尾时,慢指针指向的链表节点即为链表的中点。
对两个子链表分别排序。
将两个排序后的子链表合并,得到完整的排序后的链表。可以使用「21. 合并两个有序链表」的做法,将两个有序的子链表进行合并。
代码如下:
public class Solution { public ListNode sortList(ListNode head) { return sortList(head, null); } public ListNode sortList(ListNode head, ListNode tail) { if (head == null){ return head; } if (head.next == tail){ head.next = null; return head; } ListNode fast = head; ListNode slow = head; while (fast != tail){ slow = slow.next; fast = fast.next; if (fast != tail){ fast = fast.next; } } ListNode mid = slow; ListNode list1 = sortList(head, mid); ListNode list2 = sortList(mid, tail); return mergeTwoList(list1, list2); } //合并两个有序链表 public ListNode mergeTwoList(ListNode l1,ListNode l2){ ListNode l3 = new ListNode(); ListNode head = l3; while (l1 != null && l2 != null){ if (l1.val <= l2.val){ l3.next = l1; l1 = l1.next; }else { l3.next = l2; l2 = l2.next; } l3 = l3.next; } if (l1 != null){ l3.next = l1; }else if (l2 != null){ l3.next = l2; } return head.next; } }