Sort List --leetcode

原题链接:https://oj.leetcode.com/problems/sort-list/

题目大意:对链表进行排序,要求时间复杂度为O(NlgN) ,常量空间

解题方法:二路归并排序

思路:可以求出链表长度,然后找到中间节点,将链表分为两个链表,对两个链表分别进行排序,然后合并两个拍好序的链表。和数组的二路归并排序相似。

class Solution {
public:
       ListNode *sortList(ListNode *head) 
	   {
        if(!head)
			return NULL;
		int len=0;
		ListNode *p=head;
		while(p)
		{
			len++;
			p=p->next;
		}
		if(len==1)
			return head;
		//将链表分为两个链表
		int mid=len/2;
		ListNode *head1=head,*head2=head,*t;
		int i=0;
		while(i<mid)
		{
			t=head2;
			head2=head2->next;
			i++;
		}
		t->next=NULL;
		head1=sortList(head1);
		head2=sortList(head2);
		//merge head1,head2
		head=mergeTwoLists(head1,head2);
		return head;           
    }
    ListNode *mergeTwoLists(ListNode *l1, ListNode *l2) {
             if(l1==NULL)
                 return l2;
             if(l2==NULL)
                 return l1;
             ListNode *res=new ListNode(0);
             ListNode *temp=res;
             while(l1&&l2)
             {
                 if(l1->val<=l2->val)
                 {
                    temp->next=l1;
                    l1=l1->next;
                    temp=temp->next;
                 }
                 else
                 {
                     temp->next=l2;
                     l2=l2->next;
                     temp=temp->next;
                 } 
             }
             if(l1==NULL)
             {
               temp->next=l2;
             }
             else
             {
                 temp->next=l1;
             }
             return res->next;        
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值