快慢指针结合归并排序任意输入的链表

老子叫甜甜 提交于 2019-11-29 04:58:36

要了解快慢指针的思想,以及如何实现任意输入,何时停止

#include<stdio.h>
#include<stdlib.h>

//任意输入,排序并输出
typedef struct Node{
        int data;
        struct Node* next;
}LinkNode;

//初始链表,使用二级指针,没有头节点
void Init(LinkNode** head){
        //使用亚节点
	   int data=0;
        LinkNode  dummy;
        LinkNode* pre = NULL;
        LinkNode* temp = NULL;
        dummy.next = pre;
        pre = &dummy;
        

        printf("请输入数据:");
        while(1){
                scanf("%d", &data);
                //把空格从缓冲区读出
                
                temp = (LinkNode *)malloc(sizeof(LinkNode));
                temp ->data = data;
                temp->next = NULL;
                pre->next = temp;
                pre = temp;
				if (getchar()=='\n') {
                        break;
                }
        }

        *head  = dummy.next;
}

void swap(int *a, int *b){
        int data = 0;
        data = *a;
        *a = *b;
        *b = data;
}
//排序链表,普通的排序,时间复杂度(n*n)

void sortList(LinkNode** head){

		  LinkNode *pre = (*head), *last = NULL;
        if(*head == NULL && (*head)->next == NULL){
                return;
        }
        while(pre->next != NULL){
                last = pre->next;
                while(last != NULL){
                        if(pre->data >= last->data){
                                swap(&(pre->data),&(last->data));
                        }
                        last  = last ->next;
                } 
                pre = pre ->next;  
        }

}


//使用快慢指针实现归并排序
//并
LinkNode* Merge_sort(LinkNode *left, LinkNode* right){
        if(left == NULL) return right;
        else if(right == NULL) return left;
        else if(left->data <= right->data){
                left->next = Merge_sort(left->next,right);
                return left;
        }else{
                right->next = Merge_sort(left, right->next);
                return right;
        }
}

//分开,然后归并
LinkNode*  merge(LinkNode *head){
        //使用快慢指针的特点,递归
        LinkNode *slow = head, *fast = head, *pre = head;
        //递归终止的条件的条件
        if (!head || !head->next) return head;
        while( fast != NULL && fast->next != NULL){
                pre = slow;
                fast= fast ->next->next;
                slow = slow ->next;
        }
        //要将slow后边与前边的断开
        pre ->next = NULL;
        merge(head);
        merge(slow);
        return  Merge_sort(head,slow);     
}
//打印链表
void print(LinkNode *head){
        while(head!= NULL){
                printf("%d ",head->data);
                head = head->next;
        
        }
        printf("\n");
}
int main(){
        LinkNode* head = NULL;
        Init(&head);
	print(head);
        sortList(&head);
        print(head);
        printf("快慢指针实现归并排序:");
        merge(head);
        print(head);
        return 0;
}


结果:

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!