合并两个有序链表

https://leetcode.cn/problems/merge-two-sorted-lists

屏幕截图 2026-01-10 203422

屏幕截图 2026-01-10 203609

/**
 * 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;
}
posted @ 2026-01-10 20:59  沫忆拾忆  阅读(4)  评论(0)    收藏  举报