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
原创粉丝点击