LeetCode21题 合并两个有序链表 C语言
- 合并两个有序链表
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例 1:
输入:l1 = [1,2,4], l2 = [1,3,4]
输出:[1,1,2,3,4,4]
示例 2:
输入:l1 = [], l2 = []
输出:[]
示例 3:
输入:l1 = [], l2 = [0]
输出:[0]
提示:
两个链表的节点数目范围是 [0, 50]
-100 <= Node.val <= 100
l1 和 l2 均按 非递减顺序 排列
C语言代码
#include <stdio.h>
#include <stdlib.h>
//声明struct ListNode类型
typedef struct ListNode{
int val;
struct ListNode * next;
}LNode,*ListNode;
//函数create(),实现创建一个链表,返回链表的头指针
ListNode create(void){
ListNode head;
LNode *p1,*p2;
char a;
head=NULL;
a=getchar();
while(a!='\n'){ //输入链表的值,空格隔开,回车结束
p1=(LNode *)malloc(sizeof(LNode)); //p1为新建指针开辟空间
p1->val=a; //p1数据域赋值
if(head==NULL){
head=p1;
}else{
p2->next=p1; //p2指向链表尾部
}
p2=p1;
a=getchar();
}
p2->next=NULL; //尾部的指针的next指针置空
return head;
}
//实现将创建的两个链表按小到大顺序合并
struct ListNode* mergeTwoLists(struct ListNode *l1,struct ListNode *l2){
struct ListNode *temp,*head;
//p1=l1;
//p2=l2;
if(l1==NULL){
return l2;
}else if(l2==NULL){
return l1;
}
if( l1->val <= l2->val ){// 注意'='不能少,否则l1=123,l2=134会出错结果12334缺少l2链表的表头
head=l1;
l1=l1->next;
}else{
head=l2;
l2=l2->next;
}
temp=head;
while(l1!=NULL && l2!=NULL){
if(l1->val < l2->val){
temp->next=l1;//将较小的l1接在p节点后
temp=l1;
l1=l1->next;//同时l1向后挪一位
}else{
temp->next=l2;
temp=l2;
l2=l2->next;
}
}
if(l1!=NULL){//将较长的一段所剩余的接在p节点后
temp->next=l1;
}else{
temp->next=l2;
}
return head;
}
int main()
{
ListNode l1,l2;
l1=create();
l2=create();
mergeTwoLists(l1,l2); //连接两个链表
while(l1){
printf("%c",l1->val);
l1=l1->next;
}
return 0;
}