合并两个有序链表

题目来源于力扣–https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/xnnbp2//

1、申请一个结点作为头结点。
2、用两个指针指向两个链表,哪个链表的值小就通过尾插法插入到新的链表中。如果值相等,就任选一个作为结点插入新的链表。
3、当前链表指针后移。
4、直到有一个链表遍历完成。
5、将没空的链表的剩余结点连接到新链表。

main函数代码

#include<stdio.h>
#include<stdlib.h>
struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2);
struct ListNode {
    int val;
    struct ListNode *next;
};
int main(){
	// 动态申请第一个链表 
	struct ListNode *lnode1 = (struct ListNode *)malloc(sizeof(struct ListNode));
	struct ListNode *lnode2 = (struct ListNode *)malloc(sizeof(struct ListNode));
	struct ListNode *lnode3 = (struct ListNode *)malloc(sizeof(struct ListNode));
	struct ListNode *lnode4 = (struct ListNode *)malloc(sizeof(struct ListNode));
	struct ListNode *lnode5 = (struct ListNode *)malloc(sizeof(struct ListNode));
	// 初始化链表 
	lnode1->val = 1;
	lnode2->val = 2;
	lnode3->val = 3;
	lnode4->val = 4;
	lnode5->val = 5;
	lnode1->next = lnode2;
	lnode2->next = lnode3;
	lnode3->next = lnode4;
	lnode4->next = lnode5;
	lnode5->next = NULL;
	
	// 动态申请第二个链表 
	struct ListNode *lnode6 = (struct ListNode *)malloc(sizeof(struct ListNode));
	struct ListNode *lnode7 = (struct ListNode *)malloc(sizeof(struct ListNode));
	struct ListNode *lnode8 = (struct ListNode *)malloc(sizeof(struct ListNode));
	struct ListNode *lnode9 = (struct ListNode *)malloc(sizeof(struct ListNode));
	struct ListNode *lnode10 = (struct ListNode *)malloc(sizeof(struct ListNode));
	// 初始化链表 
	lnode6->val = 2;
	lnode7->val = 4;
	lnode8->val = 7;
	lnode9->val = 9;
	lnode10->val = 10;
	lnode6->next = lnode7;
	lnode7->next = lnode8;
	lnode8->next = lnode9;
	lnode9->next = lnode10;
	lnode10->next = NULL;
	
	// 调用函数 
	struct ListNode *newHead = mergeTwoLists(lnode1,lnode6);
	// 遍历链表 
	while(newHead){
		printf("%d ",newHead->val);
		newHead = newHead->next;
	}
	return 0;
}

合并代码

struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2){
	// 临时指针 
	struct ListNode *temp;
	// 申请一个头结点 
	struct ListNode *newHead = (struct ListNode *)malloc(sizeof(struct ListNode));
	// 指向申请的头结点 
	temp = newHead;
	// 置空 
	temp->next = NULL; 
	// 如果链表1为空,返回链表2 
	if(l1==NULL){
		return l2;
	}
	// 如果链表2为空,返回链表1 
	if(l2==NULL){
		return l1;
	}
	// 两个链表都不为空 
	while(l1!=NULL&&l2!=NULL){
		// 如果链表1的值大于等于链表2的值 
		if(l1->val>=l2->val){
			// 连接到头结点后边 
			temp->next = l2;
			// 指针后移 
			l2 = l2->next;
		}else{
			// 连接到头结点后边 
			temp->next = l1;
			// 指针后移 
			l1 = l1->next;
		}
		// 尾插法,临时指针指向最后一个结点 
		temp = temp->next;
	}
	// 链表是递增的,有一个结束了,直接将链表剩下的直接连接上 
	// 1直接连接上 
	if(l1!=NULL){
		temp->next = l1;
	}
	// 2直接连接上 
	if(l2!=NULL){
		temp->next = l2;
	}
	// 因为头结点没有值,所以返回下一个结点 
	return newHead->next;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值