Sort List
Sort a linked list inO(nlogn)
time using constant space complexity.
本题好像使用quicksort是不能AC的,只能使用归并排序了。
之前觉得是很困难的题目。
训练了这么久算法,功力终于上升了。虽然还没达化境,但是以前觉得什么归并排序,快速排序好像很难,曾经死记过,始终没有记住,一直都觉得很困惑,怎么才能写出这些算法出来。如今,随时都能写出这样算法来了。而且代码基本上都很工整,清晰的,O(∩_∩)O~
原来算法是练出来的,不是死记硬背的。
我说的化境,是觉得有一天会无论什么难题都可以轻松利用学过的算法,转化成优雅的代码,那时候所有算法都已经融会贯通了,所有题目差不多是一样的,所有算法也是差不多的。呵呵。
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
class Solution {
public:
ListNode *sortList(ListNode *head)
{
if (!head || !head->next) return head;
ListNode *slow = head;
ListNode *fast = head->next;
while (fast->next)
{
slow = slow->next;
fast = fast->next;
if (fast->next) fast = fast->next;
}
ListNode *h2 = slow->next;
slow->next = NULL;
head = sortList(head);
h2 = sortList(h2);
head = combinTwoList(head, h2);
return head;
}
ListNode *combinTwoList(ListNode *n1, ListNode *n2)
{
ListNode dummy(0);
dummy.next = n1;
ListNode *pre = &dummy;
while (pre->next && n2)
{
if (pre->next->val > n2->val)
{
ListNode *t = n2->next;
n2->next = pre->next;
pre->next = n2;
pre = n2;
n2 = t;
}
else pre = pre->next;
}
if (n2) pre->next = n2;
return dummy.next;
}
};
//2014-2-19 update
ListNode *sortList(ListNode *head)
{
if (!head || !head->next) return head;
ListNode *slow = head;
ListNode *fast = head;
while (fast->next && fast->next->next)
{
slow = slow->next;
fast = fast->next->next;
}
fast = slow->next;
slow->next = nullptr;
head = sortList(head);
fast = sortList(fast);
return mergeList(head, fast);
}
ListNode *mergeList(ListNode *h1, ListNode *h2)
{
ListNode dummy(0);
ListNode *p = &dummy;
while (h1 && h2)
{
if (h1->val < h2->val)
{
p->next = h1;
h1 = h1->next;
}
else
{
p->next = h2;
h2 = h2->next;
}
p = p->next;
}
if (h1) p->next = h1;
else p->next = h2;
return dummy.next;
}
分享到:
相关推荐
LeetCode 141 环形链表讲解 PPT
leetcode-链表笔记
Merge Sorted Array 合并 排序 数组 leetcode
LeetCode 206的题目是“反转链表”(Reverse Linked List),它要求将一个单链表的所有节点反转,并返回反转后链表的头节点。这是一个基础但非常重要的链表操作问题,它不仅考察了对链表数据结构的理解,还涉及到了...
示例1:输入:1->2->4, 1->3->4输出:1->1->2->3->4->4示例2:输入: -1->5->3->4->0输出: -1->0->3->4-
leetcode思维导图-链表
移除链表元素 1.题目说明 题目要求:删除链表中等于给定值 val 的所有节点。 示例: 输入: 1->2->6->3->4->5->6, val = 6 输出: 1->2->3->4->5 2.思路说明. 首先,初始化一个值为-1的dummy结点,指向head结点。 ...
LeetCode 203的题目是“移除链表元素”,要求从一个链表中删除所有值等于给定值val的节点,并返回新链表的头节点。这个问题考验的是对链表数据结构的理解和操作能力,包括如何遍历链表、如何处理边界条件(如头节点...
js代码-leetCode--链表 两数相加
示例 1:输入: 1->1->2输出: 1->2示例 2:输入: 1->1->2->3->3输出: 1->2->3链接:https://leetcode-cn.
题目位置题解* 思路* 1、把链表里面的元素按照从小到大存入到List里面去* 2、再把list里面的节点组装到一起返回List<ListNode> list
leetcode求链表中点 数据结构 | 算法 | 力扣笔记 数据结构 队列:FIFO - 可以使用节点(更高效)或数组及其方法(push pop 等)构建 堆栈:LIFO - 可以使用节点(更有效)或数组及其方法(push pop 等)构建 对于...
python数据结构实现(一):数组和链表及相关LeetCode题 数组和链表.pdf
Linked_List链表题型解题套路和模板【LeetCode刷题套路教程4】
1. 双指针迭代翻转链表 翻转链表和交换两个变量的操作大同小异。 首先需要一个prev指针(指着当前节点的前一个节点),一个cur指针(指着当前节点) 翻转链表需要注意的一点是:链表之间靠指针连接,如果贸然将某个...
示例 1:输入: 4->2->1->3输出: 1->2->3->4示例 2:输入: -1->5->3->4->0输出: -1->0->3->4->5解决方案*
示例 1:输入: 4->2->1->3输出: 1->2->3->4示例 2:输入: -1->5->3->4->0输出: -1->0->3->4->5* Defi