阅读 118

21. 合并两个有序链表

题目描述

将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

示例

示例 1:
输入:l1 = [1,2,4], l2 = [1,3,4]
输出:[1,1,2,3,4,4]

示例 2:
输入:l1 = [], l2 = []
输出:[]

示例 3:
输入:l1 = [], l2 = [0]
输出:[0]

来源:力扣(LeetCode)
链接:leetcode-cn.com/problems/me…

分析

根据题意,2个升序的链表组合成1个新的升序链表,那么就需要比较2个链表的节点的val值,按从小到大依次链接,过程如下:

  1. 首先创建1个头结点,该头结点的next指针指向最后的结果。定位滑动指针p,指向目前已排序的尾
  2. l1和l2不为空的时候,依次比较节点,将val值较小节点接在已排序的链表后面
  3. 循环结束后,l1和l2至少1个为空,将不为空的节点直接连在已排序的链表后就可以了

实现

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */

struct ListNode *mergeTwoLists(struct ListNode *l1, struct ListNode *l2)
{
    if (!l1) {
        return l2;
    }
    if (!l2) {
        return l1;
    }
    struct ListNode *head = (struct ListNode*)malloc(sizeof(struct ListNode));
    head->next = l1;
    head->val = 0;
    struct ListNode *p = head;    // p是滑动指针,目前指向头节点
    while (l1 && l2) {
        if (l1->val > l2->val) {
            p->next = l2;         // l2的节点小,p的next指向l2,p向后移
            l2 = l2->next;
        } else {
            p->next = l1;         // l1的节点小,p的next指向l1,p向后移
            l1 = l1->next;
        }
        p = p->next;
    }
    
    // 将不为空的剩余节点连到已排序的链表后
    if (l1) {
        p->next = l1;
    }
    if (l2) {
        p->next = l2;
    }
    return head->next;
}
复制代码
文章分类
后端
文章标签