【JS每日一算法】🟨142.对链表进行插入排序(迭代法)

154 阅读2分钟

给定单个链表的头 head ,使用 插入排序 对链表进行排序,并返回 排序后链表的头 。

插入排序 算法的步骤:

  • 插入排序是迭代的,每次只移动一个元素,直到所有元素可以形成一个有序的输出列表。
  • 每次迭代中,插入排序只从输入数据中移除一个待排序的元素,找到它在序列中适当的位置,并将其插入。
  • 重复直到所有输入数据插入完为止。

下面是插入排序算法的一个图形示例。部分排序的列表(黑色)最初只包含列表中的第一个元素。每次迭代时,从输入数据中删除一个元素(红色),并就地插入已排序的列表中。

对链表进行插入排序。

Insertion-sort-example-300px.gif

  示例 1:

image.png

输入: head = [4,2,1,3]
输出: [1,2,3,4]

示例 2:

image.png

输入: head = [-1,5,3,4,0]
输出: [-1,0,3,4,5]

提示:

  • 列表中的节点数在 [1, 5000]范围内
  • -5000 <= Node.val <= 5000

题解:

个人博客

更多JS版本题解点击链接关注该仓库👀

/**
 * @description: 迭代法  TC:O(n^2)  SC:O(1)
 * @author: JunLiangWang
 * @param {*} head 给定链表头节点
 * @return {*}
 */
function iteration(head){
    /**
     * 这题咋看比较简单,但在具体写得时候有很多需要注意得地方,
     * 比对交换两节点指针不能指向当前需要交换的两节点,而是指向
     * 其上一个节点通过next来访问,因为移动节点需要改变其上一个
     * 节点的next值
     */
    if(!head)return head
     const HEAD=new ListNode(0,head)
     let selectNode=HEAD;

     while(selectNode.next){
         let compareNode=HEAD,isChange=false;
         // 遍历比对节点
         while(compareNode.next&&compareNode.next!=selectNode.next){
            // 如果大于则需要移动节点
             if(compareNode.next.val>selectNode.next.val){
                 let nextNode=selectNode.next.next
                 selectNode.next.next=compareNode.next
                 compareNode.next=selectNode.next
                  selectNode.next=nextNode
                  isChange=true;
                  break;
             }
             compareNode=compareNode.next
         }
         if(!isChange)selectNode=selectNode.next
     }
     return HEAD.next
}

来源:力扣(LeetCode)