Leetcode 148. 排序鏈表 歸併排序O(nlogn)

鏈表歸併排序

關鍵點:用快慢指針找到鏈表的中點,分割鏈表;

快指針一次走兩步,慢指針一次一步,這樣快指針到鏈表尾部,慢指針大概就是鏈表的中點了

 

/**
 * 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) return head;
        ListNode* l = head;
        ListNode* r = head->next;
        while(r && r->next) {
            l = l->next;
            r = r->next->next;
        }
        r = l->next;
        l->next = NULL;
        l = sortList(r);
        r = sortList(head);
        return meg(l, r);
    }
    ListNode *meg(ListNode* l, ListNode* r) {
        ListNode* ans = new ListNode(-1);
        ListNode* anss = ans;
        ListNode* t;
        while(l || r) {
            if(l && r) {
                if(l->val < r->val) {
                    ans->next = l; ans = ans->next;
                    l = l->next;
                }
                else {
                    ans->next = r; ans = ans->next;
                    r = r->next;
                }
            }
            else if(l) {
                ans->next = l; break;
            }
            else {
                ans->next = r; break;
            }
        }
        return anss->next;
    }
};

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章