zoukankan      html  css  js  c++  java
  • Leetcode148. Sort List排序链表

    在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序。

    示例 1:

    输入: 4->2->1->3 输出: 1->2->3->4

    示例 2:

    输入: -1->5->3->4->0 输出: -1->0->3->4->5

    不推荐:

     class Solution {
      public:
    	  ListNode * sortList(ListNode* head) 
    	  {
    		  int len = GetLength(head);
    		  if (len == 0 || len == 1)
    			  return head;
    		  return Merge(head, 0, len - 1);
    	  }
    
    	  int GetLength(ListNode* head)
    	  {
    		  int cnt = 0;
    		  while (head)
    		  {
    			  cnt++;
    			  head = head->next;
    		  }
    		  return cnt;
    	  }
    
    	  ListNode* Merge(ListNode *head, int start, int end)
    	  {
    		  if (head == NULL || start > end)
    		  {
    			  return NULL;
    		  }
    		  if (start == end)
    		  {
    			  return new ListNode(head->val);
    		  }
    		  //
    		  int mid = (start + end) / 2;
    		  int cnt = mid;
    		  ListNode* head1 = head;
    		  while (cnt-- && head1 ->next != NULL)
    		  {
    			  head1 = head1->next;
    		  }
    		  head1 = head1 ->next;
    		  head = Merge(head, start, mid);
    //如果写mid + 1,end会出错,因为是链表,不是数组,而且head1已经到了第二个分治的链表的头部
    		  head1 = Merge(head1, 0, (end - mid - 1));
    		  ListNode *newHead = NULL;
    		  ListNode* lastNode = NULL;
    		  while (head != NULL && head1 != NULL)
    		  {
    			  if (head->val > head1->val)
    			  {
    				  if (lastNode == NULL)
    				  {
    					  newHead = new ListNode(head1->val);
    					  lastNode = newHead;
    				  }
    				  else
    				  {
    					  lastNode->next = new ListNode(head1->val);
    					  lastNode = lastNode->next;
    				  }
    				  head1 = head1->next;
    			  }
    			  else
    			  {
    				  if (lastNode == NULL)
    				  {
    					  newHead = new ListNode(head->val);
    					  lastNode = newHead;
    				  }
    				  else
    				  {
    					  lastNode->next = new ListNode(head->val);
    					  lastNode = lastNode->next;
    				  }
    				  head = head->next;
    			  }
    		  }
    
    		  while (head != NULL)
    		  {
    			  if (lastNode == NULL)
    			  {
    				  newHead = new ListNode(head->val);
    				  lastNode = newHead;
    			  }
    			  else
    			  {
    				  lastNode->next = new ListNode(head->val);
    				  lastNode = lastNode->next;
    			  }
    			  head = head->next;
    		  }
    		  while (head1 != NULL)
    		  {
    			  if (lastNode == NULL)
    			  {
    				  newHead = new ListNode(head1->val);
    				  lastNode = newHead;
    			  }
    			  else
    			  {
    				  lastNode->next = new ListNode(head1->val);
    				  lastNode = lastNode->next;
    			  }
    			  head1 = head1->next;
    		  }
    		  return newHead;
    	  }
      };

    推荐做法:

    1,快慢指针找中点;

    2,递归调用mergeSort,

    3,合并两个链表

    class Solution {
    public:
        ListNode* sortList(ListNode* head) {
            return mergeSort(head);
        }
        
        ListNode* mergeSort(ListNode* node) {
            if (!node || !node->next) return node;
            //快慢指针
            ListNode* fast = node;
            ListNode* slow = node;
            ListNode* breakN = node;
            while (fast && fast->next) {
                fast = fast->next->next;
                breakN = slow;
                slow = slow->next;
            }
            breakN->next = nullptr;
            ListNode *l1 = mergeSort(node);
            ListNode *l2 = mergeSort(slow);
            return merge(l1, l2);
        }
        
        ListNode* merge(ListNode* l1, ListNode* l2) {
            //递归到底的情况
            if (l1 == nullptr) return l2;
            if (l2 == nullptr) return l1;
            //分情况递归
            if (l1->val <= l2->val) {
                l1->next = merge(l1->next, l2);
                return l1;
            } else {
                l2->next = merge(l2->next, l1);
                return l2;
            }
        }
    }

  • 相关阅读:
    SAX解析XML笔记
    使用 Angular 2 来创建FlexGrid控件
    算法-快速排序(优雅版)
    使用泛型简化动态代理
    Java泛型概述
    POI-PPT官方文档
    Java 利用POI操作PPT
    Java8学习笔记(九)--日期/时间(Date Time)API指南
    Java8学习笔记(八)--方法引入的补充
    Android WebView加载本地html并实现Java与JS交互
  • 原文地址:https://www.cnblogs.com/lMonster81/p/10433757.html
Copyright © 2011-2022 走看看