[Leetcode] Sort List

Sort a linked list in O(n log n) time using constant space complexity.

归并排序!用慢指针、快指针来寻找二分位置,这里很容易出现错,要特别注意。

 1 /**

 2  * Definition for singly-linked list.

 3  * struct ListNode {

 4  *     int val;

 5  *     ListNode *next;

 6  *     ListNode(int x) : val(x), next(NULL) {}

 7  * };

 8  */

 9 class Solution {

10 public:

11     ListNode *mergeSort(ListNode *l1, ListNode *l2) {

12         ListNode *head = new ListNode(-1);

13         ListNode *pos = head;

14         while (l1 != NULL && l2 != NULL) {

15             if (l1->val < l2->val) {

16                 pos->next = l1;

17                 l1 = l1->next;

18             } else {

19                 pos->next = l2;

20                 l2 = l2->next;

21             }

22             pos = pos->next;

23         }

24         if (l1 == NULL) pos->next = l2;

25         if (l2 == NULL) pos->next = l1;

26         return head->next;

27     }

28     

29     ListNode *sortList(ListNode *head) {

30         if (head == NULL || head->next == NULL) return head;

31         ListNode *slow = head, *fast = head;

32         while (fast != NULL && fast->next != NULL) {

33             if (fast->next) fast = fast->next;

34             else break;

35             if (fast->next) fast = fast->next;

36             else break;

37             if (slow) slow = slow->next;

38         }

39         ListNode *head2 = slow->next;

40         slow->next = NULL;

41         head = sortList(head);

42         head2 = sortList(head2);

43         return mergeSort(head, head2);

44     }

45 };

 

你可能感兴趣的:(LeetCode)