Insertion Sort List 链表插入排序@LeetCode

本文介绍了一种使用插入排序算法对链表进行排序的方法。通过示例代码详细展示了如何逐步将链表元素按顺序插入到已排序的部分。此外,提供了一个简化版的实现思路,利用虚拟头结点构建有序链表。

原理很简单,就是插入排序,只是由于链表的性质所以必须从前向后查找该插入的位置。

但是很容易有各种小bug,一遍能做到bug-free有难度。


package Level4;

import Utility.ListNode;

/**
 * Insertion Sort List 
 * 
 *  Sort a linked list using insertion sort.
 *
 */
public class S135 {

	public static void main(String[] args) {
		ListNode head = new ListNode(4);
		ListNode n2 = new ListNode(2);
		ListNode n3 = new ListNode(1);
		ListNode n4 = new ListNode(3);
		ListNode n5 = new ListNode(1);
		head.next = n2;
		n2.next = n3;
		n3.next = n4;
//		n4.next = n5;
//		ListNode ret = insertionSortList(head);
//		ret.print();
		
		int[] list = {-84,142,41,-17,-71,170,186,183,-21,-76,76,10,29,81,112,-39,-6,-43,58,41,111,33,69,97,-38,82,-44,-7,99,135,42,150,149,-21,-30,164,153,92,180,-61,99,-81,147,109,34,98,14,178,105,5,43,46,40,-37,23,16,123,-53,34,192,-73,94,39,96,115,88,-31,-96,106,131,64,189,-91,-34,-56,-22,105,104,22,-31,-43,90,96,65,-85,184,85,90,118,152,-31,161,22,104,-85,160,120,-31,144,115};
//		int[] list = {1,0,2,1};
//		int[] list = {1,2,-1,0};
		ListNode dum = ListNode.create(list);
//		dum.print();
		
		ListNode ret = insertionSortList(dum);
		ret.print();
	}
	
	public static ListNode insertionSortList(ListNode head) {
        if(head==null || head.next==null){
        	return head;
        }
        
        ListNode p = head;		// 前后两个指针
        ListNode q = head.next;
        
        while(p!=null && q!=null){
        	if(p.val <= q.val){	// 递增顺序,无需交换,继续往前寻找
        		p = q;
        		q = q.next;
        	}else{			// out of order!
        		ListNode h = head;
        		if(head.val >= q.val){		// q元素比head元素还小的情况
        			ListNode qnext = q.next;
        			p.next = qnext;
        			q.next = head;
        			head = q;		// 更新链表头
        			q = qnext;		// 更新q的位置,让q继续往前寻找
        		}else{
        			while(h.val<=q.val && h.next.val<=q.val){	// 从head开始找,查找哪里适合放置q元素,注意元素相等的情况!
        				h = h.next;
        			}
        			if(h.val<=q.val && q.val<=h.next.val){		// 把q元素插入适当的地方
        				ListNode qnext = q.next;
        				p.next = qnext;
        				q.next = h.next;
        				h.next = q;
        				q = qnext;		// 更新q的位置,让q继续往前寻找
        			}
        		}
        	}
        }
        
        return head;
    }
}


下面是一种简单得多的方法:建立dummy节点,然后从dummy节点出发,构建有序链表,即现在有两个链表:一个是以head为头的无序链表,另一个是以dummy为头的有序链表。过程就是每次从头遍历有序链表,找到下一个适合无序链表头插入的地方。最终所有的无序链表都转移到了有序链表。

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    public ListNode insertionSortList(ListNode head) {
        ListNode dummy = new ListNode(0); // From dummy node, we will create a sorted linkedlist
        
        ListNode cur = head;
        while(cur != null) {
            ListNode pre = dummy;   // pre is used to find the place to insert
            while(pre.next!=null && cur.val>pre.next.val) { // find the element which small enough to be inserted
                pre = pre.next;
            }
            ListNode next = cur.next;   // unlink from unorder linkedlist and link to order linkedlist
            cur.next = pre.next;
            pre.next = cur;
            cur = next;
        }
        return dummy.next;
    }
}






内容概要:本文提出了一种融合模型预测控制(MPC)与人工势场法(APF)的船舶运动规划方法,旨在解决复杂海上交通场景下符合国际海上避碰规则(COLREG)的智能避碰路径规划问题。该方法充分利用MPC的滚动优化与前瞻预测能力,结合APF对动态障碍物的实时响应优势,构建包含目标引力场与多船斥力场的综合势场模型,并显式嵌入COLREG规则以确保避让行为的合法性与可解释性。通过在多船会遇、交叉、追越等多种复杂场景下的Matlab仿真实验,验证了该方法在生成安全、平滑、合规轨迹方面的有效性与鲁棒性,为智能船舶自主航行提供了可靠的决策支持。; 适合人群:从事航海自动化、智能船舶系统、海洋机器人、路径规划与智能控制研究的科研人员,以及具备Matlab编程与控制系统基础的研究生和工程技术人员。; 使用场景及目标:① 实现多船复杂交互环境下的智能避碰决策;② 开发符合国际法规的无人船自主航行系统;③ 深入学习MPC与APF融合算法的设计原理与仿真实现;④ 为智能航运、海上交通管理系统提供核心算法技术支持。; 阅读建议:建议结合提供的Matlab代码进行仿真实验,重点理解势场函数构建、COLREG规则的形式化表达、约束处理机制及MPC滚动优化的实现细节,同时对照国际避碰规则条款验证算法行为的合规性与合理性。
内容概要:本文系统研究了综合能源系统中的容量配置与运行调度问题,采用双层优化方法构建模型并通过Matlab代码实现求解。上层优化侧重于设备容量的科学配置,以降低投资成本并提升系统经济性;下层优化聚焦于多能源协同运行调度,综合考虑光伏、储能、电动汽车等多种能源形式的动态特性,旨在实现系统在不同运行工况下的能效最大化、运行可靠性与低碳化目标。研究融合智能优化算法(如遗传算法、粒子群算法)与电力系统建模技术,深入探讨了多能耦合、不确定性处理及复杂约束下的优化机制,并提供了完整的仿真案例与代码资源,涵盖微电网调度、风光储协同、电动汽车接入等典型应用场景,形成了具有较强实用价值的科研技术体系。; 适合人群:具备电力系统分析、优化算法理论及Matlab编程基础的研究生、科研人员和工程技术人员,特别适用于从事综合能源系统规划、微电网运行、智能调度与能源互联网等领域研究的专业人士。; 使用场景及目标:① 掌握双层优化在综合能源系统中的建模方法与求解流程;② 利用所提供Matlab代码进行科研复现、算法改进与系统仿真验证;③ 拓展应用于电动汽车集群调度、可再生能源消纳、多能互补系统优化等实际工程与学术研究场景; 阅读建议:建议结合文档中列出的相关研究方向与配套代码资源,按照主题分类循序渐进地学习,优先理解双层架构的设计逻辑与上下层耦合机制,并借助提供的网盘资料开展仿真实验与参数调试,以深化对优化模型与算法实现的理解,提升科研创新能力。
【重要提示】本资源设置为0积分下载,若非0积分请勿轻易下载 亲爱的CSDN用户: 首先感谢你点进这个资源页面。我需要提前说明一个重要情况: 本资源原本已设置为“0积分下载”,即作者希望完全免费共享。但CSDN平台有时会根据文件的下载热度、文件大小、用户权限等因素,自动将部分资源的积分调整为非0数值(如1积分、2积分、5积分等)。这是平台系统的自动行为,而非作者本人的设定。 因此,如果你当前看到该资源的下载所需积分不是0(例如显示为1、2、3……),请谨慎决定是否下载。 如果你按照非0积分支付并下载后发现资源内容不符合预期、链接失效,或者实际上该资源本应是免费的,作者无法为此承担积分损失或退还操作。强烈建议:仅在页面显示为0积分时进行下载。 另外,本资源描述中并未直接提供具体的下载地址或外部链接,因为它本身是一个通过CSDN官方上传通道提交的文件/内容包。如果你看到描述中没有外部网盘地址,这是正常的——资源文件应通过CSDN内置的“下载”按钮获取。若因平台积分显示异常导致你支付了积分,请优先联系CSDN客服咨询积分退还政策,作者没有权限修改平台自动设定的积分值。 感谢你的理解与支持。技术分享本应开放,但受限于平台规则,特此提醒如上。祝学习进步!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值