6-1 链表拼接(头指针)

题目

6-1 链表拼接
分数 25
作者 张泳
单位 浙江大学
本题要求实现一个合并两个有序链表的简单函数。链表结点定义如下:

struct ListNode {
int data;
struct ListNode *next;
};
函数接口定义:
struct ListNode *mergelists(struct ListNode *list1, struct ListNode *list2);
其中list1和list2是用户传入的两个按data升序链接的链表的头指针;函数mergelists将两个链表合并成一个按data升序链接的链表,并返回结果链表的头指针。

裁判测试程序样例:
#include <stdio.h>
#include <stdlib.h>

struct ListNode {
int data;
struct ListNode *next;
};

struct ListNode *createlist(); /裁判实现,细节不表/
struct ListNode *mergelists(struct ListNode *list1, struct ListNode *list2);
void printlist( struct ListNode *head )
{
struct ListNode *p = head;
while § {
printf(“%d “, p->data);
p = p->next;
}
printf(”\n”);
}

int main()
{
struct ListNode *list1, *list2;

list1 = createlist();
list2 = createlist();
list1 = mergelists(list1, list2);
printlist(list1);

return 0;

}

/* 你的代码将被嵌在这里 */
输入样例:
1 3 5 7 -1
2 4 6 -1
输出样例:
1 2 3 4 5 6 7

代码


struct ListNode *mergelists(struct ListNode *list1, struct ListNode *list2)
{
	struct ListNode *head=(struct ListNode *)malloc(sizeof(struct ListNode));
	
	struct ListNode *p=head,*p1=list1,*p2=list2;
	while(p1&&p2){
		if(p1->data>p2->data){
			p->next=p2;
			p=p->next;
			p2=p2->next;
		}else{
			p->next=p1;
			p=p->next;
			p1=p1->next;
		}
	}
	p->next=p1 ? p1:p2; 
	return head->next;
}
  • 6
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
以下是用 C 语言实现的代码: ```c #include <stdio.h> #include <stdlib.h> typedef struct Node { int data; struct Node *next; } Node; Node *createList() { Node *head = NULL, *tail = NULL; int num; scanf("%d", &num); while (num != -1) { Node *newNode = (Node*)malloc(sizeof(Node)); newNode->data = num; newNode->next = NULL; if (head == NULL) { head = newNode; tail = newNode; } else { tail->next = newNode; tail = newNode; } scanf("%d", &num); } return head; } Node *mergeList(Node *list1, Node *list2) { Node *head = NULL, *tail = NULL; while (list1 != NULL && list2 != NULL) { Node *newNode = (Node*)malloc(sizeof(Node)); if (list1->data <= list2->data) { newNode->data = list1->data; list1 = list1->next; } else { newNode->data = list2->data; list2 = list2->next; } newNode->next = NULL; if (head == NULL) { head = newNode; tail = newNode; } else { tail->next = newNode; tail = newNode; } } if (list1 != NULL) { tail->next = list1; } else { tail->next = list2; } return head; } void printList(Node *head) { Node *p = head; while (p != NULL) { printf("%d ", p->data); p = p->next; } printf("\n"); } int main() { Node *list1 = createList(); Node *list2 = createList(); Node *mergedList = mergeList(list1, list2); printList(mergedList); return 0; } ``` 首先定义了一个 `Node` 结构体作为链表的节点,其中包含了一个整型数据成员 `data` 和一个指向下一个节点的指针 `next`。 然后实现了 `createList` 函数,用于创建链表。函数中用一个循环读入若干个正整数,直到读入 -1 为止。每读入一个数就创建一个新节点,并将其插入链表的尾部。 接着实现了 `mergeList` 函数,用于将两个已按升序排列的单向链表拼接成一个链表。函数中用两个指针分别指向两个链表节点,通过比较节点数据大小来选择将哪个节点插入新链表的尾部,直到其中一个链表被遍历完为止。最后将未被遍历完的链表直接接到新链表的尾部即可。 最后实现了 `printList` 函数,用于输出链表信息。函数中用一个指针遍历链表并输出每个节点的数据。 在 `main` 函数中,先分别创建两个已按升序排列的单向链表,然后调用 `mergeList` 函数将它们拼接成一个链表,并将拼接后的链表传递给 `printList` 函数输出。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

漠–

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值