合并两个有序链表
https://leetcode.cn/problems/merge-two-sorted-lists


/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2)
有空链表时没有头节点如何合并?
可以直接分别判断两个链表是否为空,若为空直接返回另一个链表。
if(list1==NULL){
return list2;
}
if(list2==NULL){
return list1;
}
法一:利用哑节点来实现链表合并
首先创建一个头节点(即哑节点),然后遍历两个链表,每次向新链表中添加数据元素较小的节点,最后返回哑节点指向的下一个节点
实现简单,也可以不需要判断链表是否为空
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2) {
struct ListNode* p1 = list1, *p2 = list2;
struct ListNode *ret = (struct ListNode*)malloc(sizeof(struct ListNode));
ret->next = NULL;
struct ListNode *q = ret;
while(p1&&p2){
if(p1->val<=p2->val){
q->next = p1;
p1 = p1->next;
}else{
q->next = p2;
p2 = p2->next;
}
q = q->next;
}
//由于list1与list2是链表,且list2为空,则只需将新链表指向list1剩余的第一个节点
if(p1){
q->next = p1;
}
if(p2){
q->next = p2;
}
return ret->next;
}
法二:不利用头节点
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2) {
if (list1 == NULL) {
return list2;
}
if (list2 == NULL) {
return list1;
}
struct ListNode *p1 = list1, *p2 = list2;
struct ListNode *ret, *q;
if (p1->val <= p2->val) {
ret = p1;
p1 = p1->next;
} else {
ret = p2;
p2 = p2->next;
}
ret->next = NULL;
q = ret;
while (p1 && p2) {
if (p1->val <= p2->val) {
q->next = p1;
p1 = p1->next;
} else {
q->next = p2;
p2 = p2->next;
}
q = q->next;
}
if(p1){
q->next = p1;
}
if(p2){
q->next = p2;
}
return ret;
}

浙公网安备 33010602011771号