BM12 题解 | #单链表的排序#
单链表的排序
https://www.nowcoder.com/practice/f23604257af94d939848729b1a5cda08
心得感受:
1、说实在的没有想到这个思路,链表毕竟不是数组,但是,通过这次的学习认识到了,链表也可以做所为的归并排序,很有意思。
2、写算法题,重在理解原理和思路,只要理解了,很多代码,敲起来就是得心应手的。比如下面的代码,你理解了是为了截断链表给sortInList 递归,你就自然,知道第一个要填head,第二个要填mid了!
// 上面所有的变量就是为了把链表分成三段
// 理解之后,代码敲起来就随心所欲
while(right!=null && right.next !=null) {
left = left.next;
mid = mid.next;
right = right.next.next;
}
// 断开左段链表的尾节点
left.next = null;
// 进行合并递归排序
return merge(sortInList(head), sortInList(mid));
3、关键是对过程和原理的理解,如果中途不到位,就要不断调试,确认自己的真知,比如下面的合并链表,并不要求要等长,以前理解是等长了。绝对不能一直半解一知,囫囵吞枣的。
/**
* 合并链表,这里head1 和 head2 长度是可以不等长的,甚至相差好多个的。
* 如果是不等长,while循环结束后,就将剩下链表headx的多个元素追加到合并链表尾部
* 因为已经排序过了,所以,剩下的元素是可以直接追加到链表尾部到,构成有序链表
*/
ListNode merge(ListNode head1, ListNode head2) {
//函数题
}
解题思路:
1、使用sortInList(ListNode head) 对链表进行分解成两段,传入merge函数里面;
2,函数里面嵌套 merge函数进行排序,最终合成一个最终的结果链表。
import java.util.*;
/*
* public class ListNode {
* int val;
* ListNode next = null;
* public ListNode(int val) {
* this.val = val;
* }
* }
*/
public class Solution {
/**
*
* @param head ListNode类 the head node
* @return ListNode类
*/
public ListNode sortInList (ListNode head) {
if(head == null || head.next == null) {
return head;
}
ListNode left = head;
ListNode mid = head.next;
ListNode right = head.next.next;
// 上面所有的变量就是为了把链表分成三段
// 理解之后,代码敲起来就随心所欲
while(right!=null && right.next !=null) {
left = left.next;
mid = mid.next;
right = right.next.next;
}
// 断开左段链表的尾节点
left.next = null;
// 进行合并递归排序
return merge(sortInList(head), sortInList(mid));
}
/**
* 合并链表,这里head1 和 head2 长度是可以不等长的,甚至相差好多个的。
* 如果是不等长,while循环结束后,就将剩下链表headx的多个元素追加到合并链表尾部
* 因为已经排序过了,所以,剩下的元素是可以直接追加到链表尾部到,构成有序链表
*/
ListNode merge(ListNode head1, ListNode head2) {
// 定义新的链表头
ListNode res = new ListNode(0);
ListNode cur = res;
//进行排序,注意指针下移
while(head1!=null && head2!=null) {
if(head1.val <= head2.val) {
cur.next = head1;
cur = cur.next;
head1 = head1.next;
} else {
cur.next = head2;
cur = cur.next;
head2 = head2.next;
}
}
//剩下还没有排序的直接追加到链表尾
if(head1!=null) {
cur.next = head1;
} else {
cur.next = head2;
}
return res.next;
}
}
深信服公司福利 884人发布
