【LeetCode】 sort list 单链表的归并排序

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

思路:要求时间复杂度O(nlogn)

知识点:归并排序,链表找到中点的方法

存在的缺点:边界条件多考虑!!!

/**
 * LeetCode Sort List  Sort a linked list in O(n log n) time using constant space complexity.
 * 题目:将一个单链表进行排序,时间复杂度要求为o(nlogn)
 * 思路:1时间复杂度为o(nlog n)的排序算法有:归并排序、快排(期望)、堆排序
 * 		2、单链表排序用归并排序,双链表排序用快排
 * Definition for singly-linked list.
 * class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */ 

package javaTrain;

class ListNode {
	     int val;
	     ListNode next;
	     ListNode(int x) {
	         val = x;
	         next = null;
	     }
}
public class Train4 {
	public ListNode sortList(ListNode head) {
		if(head == null || head.next == null)
			return head;
		ListNode fast = head;
		ListNode slow = head;
		while(fast.next.next != null && slow.next != null){
			fast = fast.next.next;		//使得当遍历完该链表之后一个指向中间一个指向末尾,即找到链表中点
			slow = slow.next;
		}
		ListNode list2 = slow.next;
		slow.next = null;
		head = sortList(head);
		list2 = sortList(list2);
		return merge(head,list2);
}
	private static ListNode merge(ListNode list1,ListNode list2){
		if(list1 == null) return list2;
		if(list2 == null) return list1;
		ListNode head = new ListNode(0);
		ListNode last = head;
		while(list1.next != null && list2.next != null){
			if(list1.val <= list2.val){
				last.next = list1;
				list1 = list1.next;
			}
			else{
				last.next = list2;
				list2 = list2.next;
			}
			last = last.next;
		}
		if(list1 != null)
			last.next = list1;
		else if(list2 != null)
			last.next = list2;
		return head.next;
	}

}
时间: 2024-12-22 00:43:44

【LeetCode】 sort list 单链表的归并排序的相关文章

Leetcode:Reorder List 单链表重排序

Given a singly linked list L: L0→L1→-→Ln-1→Ln, reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→- You must do this in-place without altering the nodes' values. For example, Given {1,2,3,4}, reorder it to {1,4,2,3}. 分析:观察重排前和重排后的序列,发现单链表前半部分各元素的相对顺序保持不变,而后半部分逆序.因

单链表的归并排序

#include<iostream> #include<time.h> using namespace std; //链表的归并排序 struct listnode{ int value; listnode* next; listnode(int value):value(value),next(NULL){} }; listnode* find_mid(listnode* head){ if(head==NULL)return NULL; listnode* fast=head;

[LeetCode系列] 双单链表共同节点搜索问题

找到两个单链表的共同节点. 举例来说, 下面两个链表A和B: A: a1 → a2 c1 → c2 → c3 B: b1 → b2 → b3 共同节点为c1. 分析: 共同节点距离A,B的起点headA, headB的距离差为定值, 等于它们的各自总长的差值, 我们只需要求出这个差值, 把两个链表的头移动到距离c1相等距离的起点处即可. 代码: /** * Definition for singly-linked list. * struct ListNode { * int val; * Li

[Leetcode] Sort list 对链表进行排序

Sort a linked list in O(n log n) time using constant space complexity. 时间复杂度为O(nlogn),可以想到归并排序.快排.桶排序. 思路:使用归并排序,整体可以分为两体,一.构造两个已排序的子链表:二.将子链表合并.针对第一部分,可以使用快慢指针的方法,分割链表,然后对结点进行递归排序:针对第二部分,取出两子链表的表头结点进行比较大小,小的先放入新链表.针对后面大神们的删除newList的技巧,可以认真的学习.代码如下 1

单链表排序--归并排序

#include <iostream> #include <cstdlib> using namespace std; struct ListNode //默认为public { int data; ListNode* next; ListNode(int x, ListNode* nextNode):data(x), next(nextNode){} }; ListNode* mergeData(ListNode* first, ListNode* second) { if(fi

快速排序,归并排序,堆排序的数组和单链表实现

原文链接:https://www.cnblogs.com/DarrenChan/p/8807112.html 这三个排序的时间复杂度都是O(nlogn),所以这里放到一起说. 回到顶部 1. 快速排序# 快速排序(英语:Quicksort),又称划分交换排序(partition-exchange sort),通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成

链表的排序----链表的归并排序

链表的归并排序(LinkList merge sort) 首先来看看如果有两条已序(sorted)的链表 ListNode *A ,  和ListNode *B, 如何合并成一条已序的链表呢? ListNode * mergeTwoLists(ListNode *l1, ListNode *l2) { ListNode *head = new ListNode(-1); ListNode *p = head; for(;l1&&l2; p = p->next) { if(l1->

链表的归并排序

当我们需要对链表进行排序时,由于不能对它的元素进行随机访问,所以更适合使用归并排序,大名鼎鼎的快速排序用到链表上,效率也很低,原因还是在于不能对链表中的元素进行随机访问,同理,采用堆排序更是不可能的事情. 对单链表进行归并排序,单链表与数组相比只能顺序访问每个元素,因此在使用二路归并排序时关键在于找到链表的中间结点将链表一分为二:可以利用一个步长为2的指针和一个步长为1的指针同时遍历单链表,当步长为2的指针指向链表最后一个结点或者最后一个结点的下一个结点时,步长为1的指针即指向链表的中间结点.然

单链表排序(插入与归并)

struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(NULL) {} }; /* * 单链表的插入排序, 插入排序是一种稳定排序 */ class Solution7 { public: ListNode* insertionSortList(ListNode* head) { if(head == NULL || head->next == NULL) return head; ListNode *