Skip to content

Commit c34d373

Browse files
authored
Update 1.链表.md
1 parent 3aa9519 commit c34d373

File tree

1 file changed

+36
-13
lines changed

1 file changed

+36
-13
lines changed

1.链表.md

Lines changed: 36 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -630,32 +630,55 @@ k 是一个正整数,它的值小于或等于链表的长度。如果节点总
630630
148.给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。
631631
示例 1:
632632
![](https://assets.leetcode.com/uploads/2020/09/14/sort_list_1.jpg)
633+
633634
输入:head = [4,2,1,3]
634635
输出:[1,2,3,4]
635636

636637
进阶:你可以在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序吗?
637638

638-
1、普通思路:把结点存到arraylist里然后排序。
639+
思路:使用分治的思想,将链表从中间划分,两两合并(合并有序链表)
639640

640641
class Solution {
641642
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;
647649
}
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;
652678
}
653-
return list.get(0);
654679
}
655680
}
656681

657-
2、进阶:
658-
659682
## 16.合并 K 个升序链表 top100
660683

661684
23.给你一个链表数组,每个链表都已经按升序排列。

0 commit comments

Comments
 (0)