对链表进行排序

原创 2016年05月31日 14:41:32

对链表进行排序:

参考的思路是来自于这位“哥们 ”https://leetcode.com/discuss/92326/share-my-c-concise-solutions-easy-to-understand


</pre><pre name="code" class="cpp">/**
 * 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){
			return head;
		}
		ListNode *rt =  Sort(head);
		
		return rt;
    }
	ListNode * Sort(ListNode *begin ){
		//找到链表中间的位置
		if(begin == NULL){
			return NULL;
		}
		//链表只有一个元素,直接返回
		if(begin->next == NULL){
			return begin;
		}
		ListNode *fast_ptr = begin->next ;//注意这里快指针要先走一步
		ListNode *slow_ptr = begin ;
		//两个快慢指针,将量表拆分成为两个部分
		while(fast_ptr->next != NULL){
			fast_ptr = fast_ptr->next->next;
			slow_ptr = slow_ptr->next;
			if(fast_ptr == NULL){// 注意这里也一定要判断,不然会段错误
				break;
			}
		}
        
		fast_ptr = slow_ptr->next;
		slow_ptr->next = NULL;

		ListNode *l1 = Sort(begin );
		ListNode *l2 = Sort(fast_ptr);
		//将两个排序的链表合并成为一个链表
		ListNode dump(0);
		ListNode * l = &dump;

		while(l1 != NULL && l2 != NULL){
			if(l1->val < l2->val ){
				l->next = l1 ;
				l = l->next;
				l1 = l1->next;
			}
			else {
				l->next = l2;
				l = l->next;
				l2 = l2->next;
			}
		}
		if(l1 != NULL){
			l->next = l1;
		}
		if(l2 != NULL){
			l->next = l2;
		}
		return dump.next;//注意这里返回的是新的链表
	}
	void Print(ListNode * l){
		while(l != NULL){
			cout<<l->val <<" ";
			l = l->next;
		}
		cout<<endl;
	
	}
	
};


版权声明:本文为博主原创文章,转载请注明本页链接。

LeetCode147_Insertion Sort List(用插入排序算法对链表进行排序) Java题解

题目: Sort a linked list using insertion sort. 题解: 插入排序就是先对一部分进行排序 排序好后将未排序的插入到已经排序好的队列中  在插入...
  • u012249528
  • u012249528
  • 2015年07月30日 16:38
  • 2251

15.给链表中的数据排序

给定程序中,函数fun的功能是将带头节点的单向链表节点数据中的数据从小到大排序,即若原链表节点数据从头至尾的数据为:10、4、8、6,排序后链表节点数据从头至尾的数据为:2,、4、6、8、10. ...
  • u012814404
  • u012814404
  • 2015年06月23日 19:51
  • 1779

java实现单链表的增删改查与排序

LinkNode package LinkList; class Node{ public Node next; public int data; public Node(int data){...
  • wenwen360360
  • wenwen360360
  • 2017年02月18日 20:11
  • 1212

利用单链表创建多项式,并实现多项式的加减乘法运算,以及对多项式根据指数进行递增排序

  • 2014年05月25日 17:01
  • 171KB
  • 下载

用静态链表构造有向图并进行拓扑排序

  • 2011年07月12日 19:01
  • 4KB
  • 下载

静态链表优化的归并排序并与快速排序进行性能比较

  • 2014年10月23日 20:39
  • 4KB
  • 下载

C++实现两个已经排序的链表进行合并

//定义两个同种单向链表,包含一个整数值和一个指向本节点的类型的指针,该链表中的数据都已经排好序 //编制程序,合并两个链表 #include #include struct Node { int ...
  • gxwzmm
  • gxwzmm
  • 2013年02月11日 11:17
  • 3152

对链表中的数字进行排序《梁勇2011java语言程序设计基础篇》22章java集合框架编程练习题22.6

让用户从图形界面输入数字,然后在文本域中显示它们,使用链表存储这些数据,但不要存储重复的值,添加Sort,Shuffle,Reverse分别对线性排序打乱顺序与颠倒顺序...
  • vivi_and_qiao
  • vivi_and_qiao
  • 2016年12月13日 22:47
  • 201

对链表中的某一项数据进行排序

void swap_student(ST *pload,ST *temp) { int num,age; char name[20],grade[10]; float score; { ...
  • a676764356
  • a676764356
  • 2015年05月10日 15:05
  • 151

【自编小代码】用链表实现对键盘的输入进行排序

  • shangjinghua
  • shangjinghua
  • 2013年05月14日 21:05
  • 294
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:对链表进行排序
举报原因:
原因补充:

(最多只允许输入30个字)