对链表进行插入排序

题目是leetcode上面的,题目内容如下:

对链表进行插入排序。

插入排序的动画演示如上。从第一个元素开始,该链表可以被认为已经部分排序(用黑色表示)。
每次迭代时,从输入数据中移除一个元素(用红色表示),并原地将其插入到已排好序的链表中。

插入排序算法:

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

示例 1:

输入: 4->2->1->3
输出: 1->2->3->4

示例 2:

输入: -1->5->3->4->0
输出: -1->0->3->4->5


下面是我的代码:
 1 /**
 2  * Definition for singly-linked list.
 3  * public class ListNode {
 4  *     int val;
 5  *     ListNode next;
 6  *     ListNode(int x) { val = x; }
 7  * }
 8  */
 9 class Solution {
10     public ListNode insertionSortList(ListNode head) {
11         ArrayList<Integer> arr = new ArrayList<Integer>();
12         if (head == null) return head;
13         while (head != null)
14         {//将链表存在数组中
15             arr.add(head.val);
16             head = head.next;
17         }
18     
19         //用插入排序对数组进行排序
20         for (int i = 1; i < arr.size(); i++)
21         {
22             for (int j = i; j > 0 && (arr.get(j) < arr.get(j - 1)); j--)
23             {
24                 int temp = arr.get(j);
25                 arr.set(j, arr.get(j-1));
26                 arr.set(j-1, temp);
27             }
28         }
29     
30         //将数组转换成链表
31         ListNode first = new ListNode(arr.get(0));
32         ListNode temp = first;
33         for (int i = 1; i < arr.size(); i++)
34         {
35             ListNode node = new ListNode(arr.get(i));
36             temp.next = node;
37             temp = node;
38         }
39     
40         return first;
41     }
42 }

虽然有点胜之不武,但是这个方法应该还不错呢吧,呲牙呲牙。最佩服自己把搞出来的这个把数组转换成链表的方法。

猜你喜欢

转载自www.cnblogs.com/yzl12666/p/8988088.html
今日推荐