(链表)链表的排序问题

  • 题目一:对链表进行排序。

    •   方法一:利用数组进行排序。效率比较低。

      •   代码

        /**
         * 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) {
                vector<int> res;
                ListNode *temp = head;
                int length = 0;
                while (temp){
                    res.push_back(temp->val);
                    temp = temp->next, length++;
                }
                sort(res.begin(), res.end());
                temp = head;
                int i =0;
                while (temp && i<length){
                    temp->val = res[i];
                    temp = temp->next;
                    i++;
                }
                return head;
            }
        };
    •   方法二:对链表进行插入排序
      •   分析:这里其实和插入排序数组类似,但是数组是在原数组的基础上面进行插入排序的,但是对于链表来说比较复杂,所以新建链表进行插入排序。插入排序顾名思义就是一个一个的将数字插入进行,插入的过程中与链表的所有数字进行比较,找到合适的位置进行插入,所以我们设置两个指针,pre指向新链表的头部,cur指向当前链表的当前节点,之后比较两个指针的值,依次插入即可
      •   代码:

        /**
         * 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 == NULL || head->next == NULL) return head;
                ListNode* dummyhead = new ListNode(0);
                ListNode* pre = dummyhead;
                ListNode* cur = head;  
        
                while(cur != NULL)
                {
                    ListNode* next = cur->next;  //维护链表的下一个结点
                    pre = dummyhead;             //重置pre为新链表头开始  
        
                    //在当前排好的新链表中找到第一个大于cur->val的结点
                    while(pre->next != NULL && pre->next->val <= cur->val)
                    {
                        pre = pre->next;
                    }  
        
                    //当前pre的next结点的值大于cur的值,将cur插入到pre后
                    cur->next = pre->next;
                    pre->next = cur;
                    cur = next;   //cur指向原链表的下一个节点
                }
                return dummyhead->next;
            }
        };
时间: 2024-10-26 18:54:42

(链表)链表的排序问题的相关文章

双链表&amp;链表合并&amp;多项式相加算法

//单链表的合并 //链表合并 //两个链表必须是有序的 #define Maxsize 5 typedef  int elemtype; typedef struct linklist { elemtype data; struct linklist *next; }Linklist; //建立链表1 Linklist *CreateList1 () { int i,data ; Linklist *head, *p, *q; head=p=(Linklist  *)malloc(sizeof

单链表 /*链表法*/

摘要: 摘要: 根据树的原理做的一个单链表,这里,把单链表看做[树]的简化版. 在树的递归创建中,首先创建是头结点,所以单链表也是一样: 单链表的结构: typedef struct node{ int data; struct node *next; }*List,Node; 创建摘要: 根据树的原理做的阅读全文摘要: 摘要: 根据树的原理做的一个单链表,这里,把单链表看做[树]的简化版. 在树的递归创建中,首先创建是头结点,所以单链表也是一样: 单链表的结构: typedef struct

----------------------------------------链表链表!!!!------------------------------------------------------

现在处于一种     指针不熟  链表不会的状态.....先附上一个  书上的输入代码再说.........汗,先存起来    去看指针吧..... #include<stdio.h> #include<stdlib.h> #define len sizeof(struct student)//宏定义 len为 结构体的长度 struct student { long num; float score; struct student *next; }; int n; struct

[算法练习]逆置链表,链表排序,删除节点

逆置: 使用递归 //考虑递归算法,若只有一个结点,则直接返回,若存在两个结点(a1,a2)则需要做的操作有: //a2->next=a1;a1->next=NULL;return a2; //a2即新的头结点,若有三个结点,则应先将子链(a2,a3)先逆置且返回该子链的新的头结点,然后把子链(a2,a3)当作一个复合结点a2', //组成新的二元组(a1,a2')然后就可以执行前面相同的操作:a2'->next=a1;a1->next=NULL;return a3';即可,多个以

数据结构:链表 &gt;&gt; 链表按结点中第j个数据属性排序(冒泡排序法)

创建结点类,链表类,测试类 1 import java.lang.Object; 2 //结点node=数据date+指针pointer 3 public class Node { 4 Object iprop; 5 public Object getIprop(int i){ 6 switch(i){ 7 case 1:iprop=num;break; 8 case 2:iprop=name;break; 9 case 3:iprop=score;break; 10 } 11 return i

翻转链表——链表

题目描述: 给定一个链表,要求将这个链表进行翻转. 时间O(n),空间O(1) 解题思路: 设定三个指针,temp, prev,head,从头到尾依次翻转. head代表当前节点,prev代表前一个节点,temp代表下一个节点. 参考代码: /** * Definition of ListNode * * class ListNode { * public: * int val; * ListNode *next; * * ListNode(int val) { * this->val = va

剑指offer 55.链表 链表中环的入口结点

题目描述 给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null. 解题思路 第一步,找环中相汇点.分别用p1,p2指向链表头部,p1每次走一步,p2每次走二步,直到p1==p2找到在环中的相汇点. 第二步,找环的入口.接上步,当p1==p2时,p2所经过节点数为2x,p1所经过节点数为x,设环中有n个节点,p2比p1多走一圈有2x=n+x; n=x;可以看出p1实际走了一个环的步数,再让p2指向链表头部,p1位置不变,p1,p2每次走一步直到p1==p2; 此时p1指向环的入

[LeetCode] 25. K 个一组翻转链表 ☆☆☆☆☆(链表)

https://leetcode-cn.com/problems/reverse-nodes-in-k-group/solution/javadi-gui-fang-fa-100-by-chadriy-imdgvs6udp/ https://leetcode-cn.com/problems/reverse-nodes-in-k-group/solution/tu-jie-kge-yi-zu-fan-zhuan-lian-biao-by-user7208t/ 描述 给你一个链表,每 k 个节点一组

相交链表--链表

题目 编写一个程序,找到两个单链表相交的起始节点. 如下面的两个链表: 在节点 c1 开始相交. 示例 1: 输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3 输出:Reference of the node with value = 8 输入解释:相交节点的值为 8 (注意,如果两个列表相交则不能为 0).从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B

环形链表--链表

题目 给定一个链表,判断链表中是否有环. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始). 如果 pos 是 -1,则在该链表中没有环. 示例 1: 输入:head = [3,2,0,-4], pos = 1 输出:true 解释:链表中有一个环,其尾部连接到第二个节点.  示例 2: 输入:head = [1,2], pos = 0 输出:true 解释:链表中有一个环,其尾部连接到第一个节点.  示例 3: 输入:head = [1], po