Sort List
来源:互联网 发布:开淘宝店要交哪些费用 编辑:程序博客网 时间:2024/04/28 07:14
使用Merge Sort。开始的时候一直出现runtime error。检查发现在使用快慢指针确定中间节点的时候出了问题。
在确定链表时候有环的时候,我们是这样使用快慢指针的:
ListNode *slow = head, *fast = head;while (fast && fast->next) {slow = slow->next;fast = fast->next->next; }
发现使用这种写法在在确定中间节点时需要改动,在链表只有两个node情况下,slow指向最后一个node,而fast指向null。
而在merge递归的过程中,这样会出现死循环。为了使fast不为null,可以对循环判断条件稍作改动:
while(fast->next && fast->next->next) { fast = fast->next->next; slow = slow->next; } fast = slow->next; slow->next = NULL;这样就把节点数为2的链表劈成了两个节点数为1的链表。
完整代码如下:
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public: ListNode *sortList(ListNode *head) { if(!head || head->next == NULL) return head; ListNode *fast = head; ListNode *slow = head; while(fast->next && fast->next->next) { fast = fast->next->next; slow = slow->next; } fast = slow->next; slow->next = NULL; slow = sortList(head); fast = sortList(fast); return mergeList(slow, fast); } ListNode *mergeList(ListNode *h1, ListNode *h2) { ListNode dummy(-1); ListNode *cur = &dummy; while(h1 && h2) { if(h1->val < h2->val) { cur->next = h1; h1 = h1->next; cur = cur->next; } else { cur->next = h2; h2 = h2->next; cur = cur->next; } } if(h1) cur->next = h1; if(h2) cur->next = h2; return dummy.next; }};
0 0
- list sort
- list sort
- Sort List
- Sort List
- list - sort
- Sort List
- Sort List
- Sort List
- Sort List
- Sort List
- Sort List
- Sort List
- Sort List
- Sort List
- Sort List
- Sort List
- Sort List
- Sort List
- 最长公共序列的长度
- 计算机软件也有“五大部分”
- Java NIO和IO的主要区别
- 分为访问发
- C#中new一个对象的过程说明
- Sort List
- javascript基础学习-语法学习(一)
- java rmi
- java中如何表示负数?
- poj1006 中国剩余定理
- 散落风里的爱情
- [综合面试] 牛人整理分享的面试知识:操作系统、计算机网络、设计模式、Linux编程,数据结构总结
- 一个简单的线程例子
- CTO们值得考虑的十大企业级数据库