@@ -630,32 +630,55 @@ k 是一个正整数,它的值小于或等于链表的长度。如果节点总
630
630
148.给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。
631
631
示例 1:
632
632
![ ] ( https://assets.leetcode.com/uploads/2020/09/14/sort_list_1.jpg )
633
+
633
634
输入:head = [4,2,1,3]
634
635
输出:[1,2,3,4]
635
636
636
637
进阶:你可以在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序吗?
637
638
638
- 1、普通思路:把结点存到arraylist里然后排序。
639
+ 思路:使用分治的思想,将链表从中间划分,两两合并(合并有序链表)
639
640
640
641
class Solution {
641
642
public ListNode sortList(ListNode head) {
642
- if(head == null) return head;
643
- List<ListNode> list = new ArrayList<>();
644
- while(head != null){
645
- list.add(head);
646
- head = head.next;
643
+ return sortList(head, null);
644
+ }
645
+
646
+ public ListNode sortList(ListNode head, ListNode tail) {
647
+ if (head == null) {
648
+ return head;
647
649
}
648
- list.sort((node1,node2)->node1.val-node2.val);
649
- for(int i = 0; i < list.size(); i++){
650
- ListNode next = i == list.size() - 1 ? null : list.get(i+1);
651
- list.get(i).next = next;
650
+ if (head.next == tail) {
651
+ head.next = null;
652
+ return head;
653
+ }
654
+ ListNode slow = head, fast = head;
655
+ while (fast != tail) {
656
+ slow = slow.next;
657
+ fast = fast.next;
658
+ if (fast != tail) {
659
+ fast = fast.next;
660
+ }
661
+ }
662
+ ListNode mid = slow;
663
+ ListNode list1 = sortList(head, mid);
664
+ ListNode list2 = sortList(mid, tail);
665
+ ListNode sorted = merge(list1, list2);
666
+ return sorted;
667
+ }
668
+
669
+ public ListNode merge(ListNode l1, ListNode l2) {
670
+ if(l1 == null) return l2;
671
+ if(l2 == null) return l1;
672
+ if(l1.val <= l2.val){
673
+ l1.next = merge(l1.next, l2);
674
+ return l1;
675
+ }else{
676
+ l2.next = merge(l1, l2.next);
677
+ return l2;
652
678
}
653
- return list.get(0);
654
679
}
655
680
}
656
681
657
- 2、进阶:
658
-
659
682
## 16.合并 K 个升序链表 top100
660
683
661
684
23.给你一个链表数组,每个链表都已经按升序排列。
0 commit comments