算法打卡日志-2020.11.20| LeetCode147
这是一道链表题,解题思路较简单,就是遍历,再从头到尾查找合适的位置插入,但是实际实现时,有很多坑,这些也是链表问题需要仔细注意的,建议画示意图来辅助解题。
虽然思路简单但是Coding时也很坑,最繁琐的就是插入时的过程了,建议通过画图的方式来进行分析。最常见的问题就是指针丢失,本题中,三个坑都是指针丢失的问题,其中坑1和坑2容易发现,坑3是最容易忽视的。
public ListNode insertionSortList(ListNode head) {
//空表处理,虽然不一定有用,但是是一个良好的习惯
if (head==null||head.next==null){
return head;
}
//哨兵头节点,减少可能出现的错误
ListNode guardHead=new ListNode(0,head);
//已排序的最后一个节点
ListNode tailNode=guardHead;
//当前正在处理的节点
ListNode currNode=head;
//下一个要处理的节点
ListNode nextNode=null;
while(currNode!=null){
//查找插入位置
ListNode eNode=guardHead;
nextNode=currNode.next;//坑1:下一节点丢失
while(eNode!=null&&eNode.next!=null){
//这个判断是为了处理第一个数据时的尾节点
if (eNode.next==currNode){
tailNode=tailNode.next;
break;
}
if (currNode.val>eNode.next.val){
eNode=eNode.next;
}else {
ListNode tmp=eNode.next;//坑2:后续节点丢失
eNode.next=currNode;
currNode.next=tmp;
tailNode.next=nextNode;//坑3:已排序的尾节点没能正确连接下一节点
break;
}
}
currNode=nextNode;
}
return guardHead.next;
}