单链表的排序、有序合并

一、排序

这里只介绍冒泡排序

①冒泡排序:

排序前:5 4 3 2 1
排序后:1 2 3 4 5

1
2
3
5/a
4/b

我们先定住a在5处,b在a的后面。之后4与5比较,若4小于5则把节点数据交换,之后b挪动到3处。

1
2
5
4/a
3/b

3与4比较,节点数据交换,b继续往后挪动一个节点。

1
4
5
3/a
2/b

2与3比较,节点数据交换,b继续往后挪动一个节点。

3
4
5
2/a
1/b

1与2比较,节点数据交换,b继续往后挪动一个节点,b等于NULL。

2
3
4
5
1/a

此时最小的数据已经挪动到了最前面,该处应该循环结束。开始下一轮新的循环,把后面4个数的最小值2放在1后面。

此时我们将a往后挪动一个节点,b在a的后面。

1
2
3
5/a
4/b

接下来的思路和上面一样,定住a,移动b。
②代码实现:

//sort函数如下:
void sort(Node*head)
{
    int t;
    Node*a;
    Node*b;
    for(a=head->next;a!=NULL;a=a->next)
    {
        for(b=a->next,t=0;b!=NULL;b=b->next)
        {
            if(a->data>b->data)
            {
                t = a->data;        
				a->data = b->data;
				b->data = t;        
            }
        }
    }
}

输出结果:
单链表的排序、有序合并_第1张图片

二、有序合并

①什么是有序合并?

合并就是将两个链表组装成一个链表,并且新链表节点数据按升序或降序的方式排列。

link_one:5 2 1
link_two:1 3 1 4
link_new:1 1 1 2 3 4 5

②思路及代码实现

head1 : 1 2 5
head2 : 3 4 6 7
合并后的head3 : 1 2 3 4 5 6 7

这里我们假设已创建的两个链表是升序链表,并且将这两个链表合并为新的升序链表。我们的思路是将两个链表里的节点串起来。

新建一个头指针head3,比较head1、head2里面节点数据大小,1<3那么把1放在head3后面,再比较2<3把2放在1后面,5>3把3放在2后面,4<5把4放在3后面,6>5将5放在4后面。之后head1遍历完了,那么将剩下的4 6 7直接接在5后面。

1
2
3
4
5
6
7
head1
head2

合并后:

del是删除该映射

del
del
head1
1
2
5
head3
3
4
6
head2
7
//combine函数如下
Node*combine(Node*head1,Node*head2)
{
    Node*head3=(Node*)malloc(sizeof(Node));
    Node*p1=head1->next;
    Node*p2=head2->next;
    Node*p3=head3;
    while(p1!=NULL&&p2!=NULL)
    {
       if(p1->data>=p2->data)
       {
           p3->next=p2;					//尾插法
           p3=p2;
           p2=p2->next;
       }
       else
       {
           p3->next=p1;					//尾插法
           p3=p1;
           p1=p1->next;
       }
    }
    if(p1!=NULL)
    {
        p3->next=p1;
    }
    if(p2!=NULL)
    {
        p3->next=p2;
    }
    return head3;
}

输出结果:
单链表的排序、有序合并_第2张图片
:这里应用了尾插法,如果使用头插那么输出的结果则是逆序的。

你可能感兴趣的:(数据结构)