leetcode147:对链表进行插入排序
package com.mxnet;
public class Solution147 {
public static void main(String[] args) {
}
/**
* Q: 给定单个链表的头 head ,使用 插入排序 对链表进行排序,并返回 排序后链表的头
* @param head
* @return
* 思路:
* 1. 先判断节点是否为空或者是否只有一个元素
* 2. 定义辅助节点dummyHead让其下一个元素指向head,方便可以在head前插入元素
* 3. 从第二个节点开始依次扫描节点,寻找当前节点要插入的位置
* 4. 找到其位置后将其插入
* 5. 返回dummyHead.next
*/
public ListNode insertionSortList(ListNode head) {
//若链表为空或者链表只有一个元素,直接返回head
if (head == null || head.next == null){
return head;
}
//创建dummyHead链表,让其后一个节点指向head
ListNode dummyHead = new ListNode();
dummyHead.next = head;
//定义辅助指针finalNode指向排好序的链表的最后,默认指向head
ListNode finalNode = head;
//定义辅助指针cur保存当前要插入的元素,默认指向head.next
ListNode cur = head.next;
while (cur != null){
if (cur.val >= finalNode.val){
finalNode = finalNode.next;
}else {
//创建辅助指针prev记录当前节点要插入位置的前一个位置
ListNode prev = dummyHead;
//从前往后扫描节点,寻找当前节点要插入的位置
while (prev.next.val <= cur.val){
prev = prev.next;
}
//找到要插入的位置后将其插入
//将排好序链表的最后一个元素指向当前节点的下一个元素
finalNode.next = cur.next;
//将当前节点进行插入
cur.next = prev.next;
prev.next = cur;
}
//节点后移,判断下一个节点
cur = finalNode.next;
}
return dummyHead.next;
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理