LeetCode:Sort List

复习了一下归并排序,通过快指针和慢指针的方法找到中间结点。但要注意,由于归并排序的思想是从中间将数列分为两段,那么在采用链表时,需要找到中间位置的前一个结点。这个一定要注意,愣是改了一上午才找到stack outflow的原因。合并两个有序的链表我选择的是递归算法,很简单,在这里就不作解释了。

<pre name="code" class="cpp">class Solution {
public:
//归并排序
    ListNode *Merge(ListNode *l1,ListNode *l2)
    {
        ListNode *l=NULL;
        if(!l1)
             return l2;
        else if(!l2)
              return l1;
        if(l1->val<l2->val)
        {
            l=l1;
            l->next=Merge(l1->next,l2);
        }
        else{
            l=l2;
            l->next=Merge(l1,l2->next);
        }
        //l->next=NULL;
        return l;
    }
    ListNode *sortList(ListNode *head) {
        if(!head||!head->next)//如果为空或只有一个结点,直接返回
            return head;
        else{//如果有一个以上结点,采用中间值分解成两个链表的方法递归调用
           //ListNode *p;
           ListNode *mid,*p,*q,*pre;//pre指向中间节点的前一个节点。p为慢指针,q为快指针,q走到结尾结束
           //if(head!=rail){
             p=head;
             q=head;
             pre=head;
             mid=NULL;
             //q=q->next;
           while(q&&q->next)
           {
               if(p!=head)
                 pre=pre->next;
               p=p->next;
               q=q->next->next;
           }
		   mid=p;
           //q=mid->next;
           pre->next=NULL;
           head=sortList(head);
           mid=sortList(mid);
           return Merge(head,mid);
         //  }
        }
    }
};


 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值