题目描述
将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例
示例 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个头结点,该头结点的next指针指向最后的结果。定位滑动指针p,指向目前已排序的尾
- l1和l2不为空的时候,依次比较节点,将val值较小节点接在已排序的链表后面
- 循环结束后,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;
}