链表系列文章(四)

上一篇讨论了链表的反转问题,这一篇讨论链表排序的问题

 

1. 排序两个有序链表

比较简单,属于归并排序,不再赘述

时间复杂度O(n), 空间复杂度O(1)

 1 ListNode *mergeList( ListNode *list1, ListNode *list2 ) {
 2     if(!list1 || !list2) return list1 ? list1 : list2;
 3     ListNode res(-1), *phead = &res;
 4     while(list1 && list2) {
 5         if(list1->digit < list2->digit) { phead->next = list1; list1 = list1->next; }
 6         else { phead->next = list2; list2 = list2->next; }
 7         phead = phead->next;
 8     }
 9     phead->next = list1 ? list1 : list2;
10     return res.next;
11 }

 

2. 单链表排序

方法一:递归+分治

时间复杂度O(nlogn),空间复杂度O(logn)

 1 ListNode *sortList(ListNode *head) {
 2     if(NULL == head || NULL == head->next)
 3         return head;
 4     ListNode *fast = head, *slow = head;
 5     while(fast->next && fast->next->next) {slow = slow->next; fast = fast->next->next;}
 6     fast = slow->next;
 7     slow->next = NULL;//divide
 8     head = sortList(head);
 9     fast = sortList(fast);
10     ListNode res(INT_MIN);
11     slow = &res;
12     while(head && fast) {//merge
13         if(head->val < fast->val) {slow->next = head; head = head->next;}
14         else {slow->next = fast; fast = fast->next;}
15         slow = slow->next;
16     }
17     slow->next = head == NULL ? fast : head;
18     return res.next;
19 }

 

方法二:迭代法

时间复杂度O(nlogn),空间复杂度O(1)

请参考博客:http://www.cnblogs.com/sosohu/p/4127213.html

 

由于本人水平有限,文中难免有不当和错误之处,欢迎大家批评指正,愿共同进步!!!

 

转载于:https://www.cnblogs.com/zhuoyuan/p/4132978.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值