合并两个有序链表形成一个新的有序链表

/*
 * test.c
 *
 *  Created on: 2013年10月8日
 *      Author: lxm2527
 */

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

typedef struct list
{
	int data;
	struct list* next;
}LIST;

/*
 * @函数名 :Display
 * @brief:打印链表
 * @return:int
 * @param:LIST* pkTemp
 * @remark:
 *
 */

int Display(LIST *pkTemp)
{
	while(pkTemp)
	{
		printf("%d ",pkTemp->data);
		pkTemp = pkTemp->next;
	}
	printf("\n");
	return 0;
}

/*
 * @函数名 :CreateList
 * @brief:创建新链表
 * @return:LIST*
 * @param:int nArray[]
 * @param:int len
 * @remark:
 *
 */

LIST* CreateList(int nArray[],int len)
{
	LIST* pkHead = NULL,*pkTail = NULL;
	LIST* pkTemp = NULL;
	int i;
	for(i = 0;i < len;i++)
	{
		pkTemp = malloc(sizeof(LIST));
		pkTemp->data = nArray[i];
		pkTemp->next = NULL;
		if(pkHead == NULL)
		{
			pkHead = pkTemp;
			pkTail = pkHead;
		}
		else
		{
			pkTail->next = pkTemp;
			pkTail = pkTemp;
		}
	}
	return pkHead;
}

/*
 * @函数名 :Sort
 * @brief:把两个有序的链表合成一个有序的链表
 * @return:LIST*
 * @param:LIST* pkOne
 * @param:LIST* pkTwo
 * @remark:
 *
 */

LIST* Sort(LIST* pkOne,LIST* pkTwo)
{
	LIST* pkHead = NULL,*pkTail = NULL;
	LIST* pkTemp = NULL;
	while(NULL != pkOne && NULL != pkTwo)
	{
		if(pkOne->data < pkTwo->data)
		{
			pkTemp = malloc(sizeof(LIST));
			if(NULL == pkTemp)
			{
				return NULL;
			}
			pkTemp->data = pkOne->data;
			pkTemp->next = NULL;
			if(pkHead == NULL)
			{
				pkHead = pkTemp;
				pkTail = pkHead;
			}
			else
			{
				pkTail->next = pkTemp;
				pkTail = pkTemp;
			}
			pkOne = pkOne->next;
		}
		else
		{
			pkTemp = malloc(sizeof(LIST));
			if(NULL == pkTemp)
			{
				return NULL;
			}
			pkTemp->data = pkTwo->data;
			pkTemp->next = NULL;
			if(pkHead == NULL)
			{
				pkHead = pkTemp;
				pkTail = pkHead;
			}
			else
			{
				pkTail->next = pkTemp;
				pkTail = pkTemp;
			}
			pkTwo = pkTwo->next;
		}
	}
	//如果链表一还没有结束
	while(NULL != pkOne)
	{
		pkTemp = malloc(sizeof(LIST));
		if(NULL == pkTemp)
		{
			return NULL;
		}
		pkTemp->data = pkOne->data;
		pkTemp->next = NULL;

		pkTail->next = pkTemp;
		pkTail = pkTemp;

		pkOne = pkOne->next;
	}
	//如果链表二还没有结束
	while(NULL != pkTwo)
	{
		pkTemp = malloc(sizeof(LIST));
		if(NULL == pkTemp)
		{
			return NULL;
		}
		pkTemp->data = pkTwo->data;
		pkTemp->next = NULL;

		pkTail->next = pkTemp;
		pkTail = pkTemp;

		pkTwo = pkTwo->next;
	}

	pkTemp = pkHead;
	return pkTemp;
}

int main()
{
	int nArray[] = {-5,1,4,7,8,11,14,15,21,24};
	int nArray2[] = {-2,-3,7,9,14,17,23,25,29,33};

	int len = sizeof(nArray)/sizeof(nArray[0]);
	int len2 = sizeof(nArray2)/sizeof(nArray2[0]);

	LIST* pkTemp = CreateList(nArray,len);
	Display(pkTemp);
	LIST* pkTemp2 = CreateList(nArray2,len2);
	Display(pkTemp2);
	LIST* pkTemp3 = Sort(pkTemp, pkTemp2);
	Display(pkTemp3);
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我理解了你的问题。 以下是C语言代码,它可以将两个有序链表合并一个,并返回其中一个链表(假设第一个链表为返回链表): ```c #include <stdio.h> #include <stdlib.h> // 定义链表结构体 typedef struct Node { int val; struct Node* next; } Node; // 合并两个有序链表 Node* merge(Node* l1, Node* l2) { // 定义返回链表和当前节点指针 Node* ret = l1; Node* cur = l1; // 判断链表是否为空 if (l1 == NULL) { return l2; } if (l2 == NULL) { return l1; } // 按照从小到大的顺序合并链表 if (l1->val < l2->val) { cur = l1->next; } else { ret = l2; cur = l2->next; l2 = l1; l1 = ret; } Node* prev = ret; while (cur != NULL && l2 != NULL) { if (l2->val < cur->val) { prev->next = l2; l2 = l2->next; prev = prev->next; prev->next = cur; } else { prev = cur; cur = cur->next; } } // 将剩余的节点添加到链表中 if (l2 != NULL) { prev->next = l2; } // 返回链表 return ret; } // 创建节点 Node* createNode(int val) { Node* newNode = (Node*)malloc(sizeof(Node)); newNode->val = val; newNode->next = NULL; return newNode; } // 输出链表 void printList(Node* head) { Node* cur = head; while (cur != NULL) { printf("%d ", cur->val); cur = cur->next; } printf("\n"); } int main() { // 创建两个有序链表 Node* l1 = createNode(1); l1->next = createNode(3); l1->next->next = createNode(5); Node* l2 = createNode(2); l2->next = createNode(4); l2->next->next = createNode(6); // 输出两个链表 printf("l1: "); printList(l1); printf("l2: "); printList(l2); // 合并链表并输出 Node* ret = merge(l1, l2); printf("merged: "); printList(ret); return 0; } ``` 这段代码中,我们首先定义了一个链表的结构体 `Node`,然后定义了合并两个有序链表的函数 `merge`。在函数中,我们先判断了链表是否为空,并根据两个链表的节点值的大小比较,确定了返回链表和当前节点指针的初始值。接着,我们使用 `while` 循环来合并两个链表,直到其中一个链表为空。对于每一个节点值较小的链表节点,我们都将它插入到返回链表中,直到两个链表中有一个为空。最后,我们将剩余的节点加入到链表中,并返回返回链表的头指针。 在 `main` 函数中,我们创建了两个有序链表 `l1` 和 `l2`,并输出它们的值。然后,我们调用 `merge` 函数将两个链表合并,并输出合并后的链表

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值