#yyds干货盘点# LeetCode 腾讯精选练习 50 题:排序链表

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了#yyds干货盘点# LeetCode 腾讯精选练习 50 题:排序链表相关的知识,希望对你有一定的参考价值。

题目:

给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。

 

示例 1:

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

输出:[1,2,3,4]

示例 2:

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

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

示例 3:

输入:head = []

输出:[]

代码实现:

class Solution 
public ListNode sortList(ListNode head)
if (head == null)
return head;

int length = 0;
ListNode node = head;
while (node != null)
length++;
node = node.next;

ListNode dummyHead = new ListNode(0, head);
for (int subLength = 1; subLength < length; subLength <<= 1)
ListNode prev = dummyHead, curr = dummyHead.next;
while (curr != null)
ListNode head1 = curr;
for (int i = 1; i < subLength && curr.next != null; i++)
curr = curr.next;

ListNode head2 = curr.next;
curr.next = null;
curr = head2;
for (int i = 1; i < subLength && curr != null && curr.next != null; i++)
curr = curr.next;

ListNode next = null;
if (curr != null)
next = curr.next;
curr.next = null;

ListNode merged = merge(head1, head2);
prev.next = merged;
while (prev.next != null)
prev = prev.next;

curr = next;


return dummyHead.next;


public ListNode merge(ListNode head1, ListNode head2)
ListNode dummyHead = new ListNode(0);
ListNode temp = dummyHead, temp1 = head1, temp2 = head2;
while (temp1 != null && temp2 != null)
if (temp1.val <= temp2.val)
temp.next = temp1;
temp1 = temp1.next;
else
temp.next = temp2;
temp2 = temp2.next;

temp = temp.next;

if (temp1 != null)
temp.next = temp1;
else if (temp2 != null)
temp.next = temp2;

return dummyHead.next;


以上是关于#yyds干货盘点# LeetCode 腾讯精选练习 50 题:排序链表的主要内容,如果未能解决你的问题,请参考以下文章

#yyds干货盘点# LeetCode 腾讯精选练习 50 题:螺旋矩阵

#yyds干货盘点# LeetCode 腾讯精选练习 50 题:存在重复元素

#yyds干货盘点# LeetCode 腾讯精选练习 50 题:LRU 缓存

#yyds干货盘点# LeetCode 腾讯精选练习 50 题:螺旋矩阵 II

#yyds干货盘点# LeetCode 腾讯精选练习 50 题:爬楼梯

#yyds干货盘点# LeetCode 腾讯精选练习 50 题:Nim 游戏