题目来源于力扣–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;
}