合并两个有序链表
思路:创建新链表,遍历原链表,比较大小,谁小就尾插到新链表
思路代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
typedef struct ListNode ListNode;
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2) {
//处理链表为空的情况
if(list1 == NULL){
return list2;
}
if(list2 == NULL){
return list1;
}
//创建新的链表
ListNode* newHead = NULL,*newTail = NULL;
//创建两个指针分别指向两个链表的头节点
ListNode* l1 = list1;
ListNode* l2 = list2;
while(l1 && l2){
if(l1->val < l2->val){
//l1尾插到新链表中
if(newHead == NULL){
newHead = newTail = l1;
}
else{
newTail->next = l1;
newTail = newTail->next;
}
l1 = l1->next;
}
else{
//l2尾插到新链表中
if(newHead == NULL){
newHead = newTail = l2;
}
else{
newTail->next = l2;
newTail = newTail->next;
}
l2 = l2->next;
}
}
//跳出循环只有两种情况:要么l1为空,要么l2为空
if(l1){
newTail->next = l1;
}
if(l2){
newTail->next = l2;
}
return newHead;
}
因为链表分为空和非空两种情况导致代码有点冗余,我们可以通过封装函数或者直接创建一个空链表来解决。
采用后者优化后:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
typedef struct ListNode ListNode;
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2) {
//处理链表为空的情况
if(list1 == NULL){
return list2;
}
if(list2 == NULL){
return list1;
}
//创建新的链表
ListNode* newHead,*newTail;
newHead = newTail = (ListNode*)malloc(sizeof(ListNode));
//创建两个指针分别指向两个链表的头节点
ListNode* l1 = list1;
ListNode* l2 = list2;
while(l1 && l2){
if(l1->val < l2->val){
//l1尾插到新链表中
newTail->next = l1;
newTail = newTail->next;
l1 = l1->next;
}
else{
//l2尾插到新链表中
newTail->next = l2;
newTail = newTail->next;
l2 = l2->next;
}
}
//跳出循环只有两种情况:要么l1为空,要么l2为空
if(l1){
newTail->next = l1;
}
if(l2){
newTail->next = l2;
}
ListNode* ret = newHead->next;
free(newHead);
newHead = NULL;
return ret;
}