sort-list——链表、快慢指针找中间、归并排序

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

链表,快慢指针找中点,归并排序。

注意判断条件fast->next!=NULL&&fast->next->next!=NULL,若为fast!=NULL&&fast->next!=NULL则会出现内存溢出

 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 *sortList(ListNode *head) {
12         if(head==NULL || head->next==NULL)
13             return head;
14         ListNode* slow, *fast;
15         slow=head;
16         fast=head;
17         while(fast->next!=NULL&&fast->next->next!=NULL){
18             slow=slow->next;
19             fast=fast->next->next;
20         }
21         fast=slow;
22         slow=slow->next;
23         fast->next=NULL;
24         fast=sortList(head);
25         slow=sortList(slow);
26         return merge(fast,slow);
27
28     }
29     ListNode *merge(ListNode *left, ListNode *right){
30         ListNode *res,*temp;
31         if(left==NULL){
32             res=right;
33             return res;
34         }
35         if(right==NULL){
36             res=left;
37             return res;
38         }
39         if(left->val<=right->val){
40             res=left;
41             left=left->next;
42         }else{
43             res=right;
44             right=right->next;
45         }
46         temp=res;
47         while(left!=NULL&&right!=NULL){
48             if(left->val<=right->val){
49                 temp->next=left;
50                 left=left->next;
51             }else{
52                 temp->next=right;
53                 right=right->next;
54             }
55             temp=temp->next;
56
57         }
58         if(left!=NULL){
59             temp->next=left;
60         }
61         if(right!=NULL){
62             temp->next=right;
63         }
64         return res;
65     }
66 };
时间: 2024-08-27 01:39:08

sort-list——链表、快慢指针找中间、归并排序的相关文章

一文学会链表快慢指针解题技巧

前言 上文 我们详细地学习了链表的基本概念,优缺点,也带大家一步步由浅入深地学习了链表的翻转技巧,这一篇我们来看看链表的另一个解题技巧:快慢指针. 快慢指针在面试中出现的概率也很大,也是务必要掌握的一个要点,本文总结了市面上常见的快慢指针解题技巧,相信看完后此类问题能手到擒来.本文将详细讲述如何用快慢指针解决以下两大类问题 寻找/删除第 K 个结点 有关链表环问题的相关解法 寻找/删除第 K 个结点 小试牛刀之一 LeetCode 876:给定一个带有头结点 head 的非空单链表,返回链表的中

单链表-快慢指针

快慢指针: 定义两个指针,一个快,一个慢,可以有多种用途.例如:快速找到位置长度单链表中的中间结点:对于循环链表中利用快慢指针也可以判断是否存在环. 快速找到位置长度单链表中的中间结点 1)使用一个指针,先索引一遍获取总长度,再取长度一半去循环获取到中间值:O(3L/2). 2)使用两个指针,快指针和慢指针,快指针一次向前走2格,慢指针一次走一格,当快指针走完全程,慢指针正好走在中间:O(L/2). 代码实现: //快速查找中间元素 int FindMidEle(LinkList L, Elem

为什么用快慢指针找链表的环,快指针和慢指针一定会相遇

https://www.zhihu.com/question/23208893 首先相遇不是操场跑圈,快的能追上慢的,这还用问吗,肯定能追上.而楼主问的是一个人是跳1个格子,另一个跳2个格子,会不会每次要相遇的时候,快的都会跳过慢的那个,从而不会相遇在一个格子.(重点是为什么一定会相遇在一个格子) 通俗点可以理解为他们的相对速度只差一个格子,快的只能一个一个格子的去追慢的,必然在一个格子相遇! 如果没看懂,看下面的详细.一次跳2个与一次跳一个格子的追上之后,是一定会在一个格子遇到的.因为在即将追

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}. 由于链表尾端不干净,导致fast->next!=NULL&&fast->next-&

[LeetCode]148. Sort List链表归并排序

要求时间复杂度O(nlogn),空间复杂度O(1),采用归并排序 传统的归并排序空间复杂度是O(n),原因是要用一个数组表示合并后的数组,但是这里用链表表示有序链表合并后的链表,由于链表空间复杂度是O(1),所以可以. 链表问题经常出现TLE问题或者MLE问题,这时候要检查链表拼接过程或者循环过程,看有没有死循环 public ListNode sortList(ListNode head) { if (head==null||head.next==null) return head; //利用

快慢指针原理--快速找到未知长度单链表的中间节点

package com.java.dataStruct; //节点类 public class Node<E> { E item; Node next; public Node(){ } public Node(E element){ this.item = element; } public Node(E element, Node next){ this.item = element; this.next = next; } } Node p1,r1; Node L1 = new Node

求单链表的中间节点,用快慢指针

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 Node* findMid(Node* &head) {     if(head == NULL||head->next == NULL)         return head;          Node* p = head;     Node* q = head;     while(q->next->next&&(q = q->next))     {         p = p-

快慢指针,怎样快速获取链表的中间元素

有一个链表,怎样快速获取中间节点的元素. 方法1 遍历一下链表,确认长度,获取中间的节点元素,时间复杂度O(N) 方法2 设置两个指针,一个遍历p->nexr  一个 p->next->next,快慢指针的思想  时间复杂度为O(n/2) 代码: 1 //腾讯面试题,获取一个单链表的中间位置 2 Status GetMidNode(LinkList L,ElemType *e) 3 { 4 LinklList search,mid; 5 mid =search=L; 6 while (s

利用快慢指针快速得到链表中间节点

//利用快慢指针快速得到链表中间节点 int getMiddleNodeValue(LIST * l) { NODE * search, * middle; search = l->head; middle = l->head; while (NULL != search->next) { if (NULL != search->next->next) { search = search->next -> next; middle = middle->nex