下面是一些常考链表的知识:
- 反转链表
- 寻找链表的中点
- 两个有序链表排序
- 链表排序:merge sort
Given the
headof a linked list, return the list after sorting it in ascending order.
Example 1:
Input: head = [4,2,1,3]
Output: [1,2,3,4]
Example 2:
Input: head = [-1,5,3,4,0]
Output: [-1,0,3,4,5]
Example 3:
Input: head = []
Output: []
使用归并排序
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 slow = head;
ListNode fast = 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);
ListNode sorted = merge(list1, list2);
return sorted;
}
public ListNode merge(ListNode head1, ListNode head2) {
ListNode dummy = new ListNode(0);
ListNode l1 = head1;
ListNode l2 = head2;
ListNode curr = dummy;
while(l1 != null && l2 != null) {
if(l1.val < l2.val) {
curr.next = l1;
l1 = l1.next;
} else {
curr.next = l2;
l2 = l2.next;
}
curr = curr.next;
}
if(l1 != null) {
curr.next = l1;
} else if(l2 != null) {
curr.next = l2;
}
return dummy.next;
}
}