使用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;
}
};