148.排序链表
给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。
归并排序
思路:
- 将链表分成两个子链表
- 对两个子链表排序后再将它们合并成一个排序的链表
```javascript
var sortList = function (head) {
if (!head || !head.next) return head;
let slow = head, fast = head;
let preSlow = null;
while (fast && fast.next) {
} preSlow.next = null; const l = sortList(head); const r = sortList(slow); return merge(l, r); };preSlow = slow;slow = slow.next;fast = fast.next.next;
function merge(l1, l2) { const dummy = new ListNode(0); let prev = dummy; while (l1 && l2) { if (l1.val < l2.val) { prev.next = l1; l1 = l1.next; } else { prev.next = l2; l2 = l2.next; } prev = prev.next; } if (l1) prev.next = l1; if (l2) prev.next = l2; return dummy.next; }
时间复杂度是 O(nlogn)<br />空间复杂度是 O(logn)<a name="RaHS5"></a>## 179.最大数<a name="YsNQo"></a>### 自定义排序- 做一个特殊的降序排列 a + b 与 b + a 比较 (类型隐式转换)思路:1. 把两个数字a、b合起来,比较ab和ba的大小,取大的1. 按自定义规则,降序排序简洁代码```javascriptvar largestNumber = function(nums) {const res = nums.sort((a, b) => (b + '' + a) - (a + '' + b)).join('')return res.startsWith('0') ? '0' : res//处理元素全为0的情况};
or
var largestNumber = function(nums) {nums = nums.sort((a, b) => {let S1 = `${a}${b}`;let S2 = `${b}${a}`;return S2 - S1;});return nums[0] ? nums.join('') : '0';};
