描述#
将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
思路#
- 有空链表时,返回另一个链表,无论另一个链表是否为空链表皆符合规则
- 将首元素较小的链表设为被插入链表,另一个设为插入链表,被插入链表即最后返回的链表
- 当前插入链表非空或被插入链表还有下一个元素时,如果插入链表的元素不大于被插入链表下一个元素,则插入到下一个元素之前,否则当前插入链表往后递增
- 插入链表仍有元素存在时(当有大于被插入链表最后一个数时,上个过程不会插入进去),需要直接接在被插入链表后
struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2){
struct ListNode* l_get_buffer,*l_set_buffer,*l_final,*l_get,*l_set;
//有空链表时
if(!(l1 && l2)) {
return l1?l1:l2;//l1非空则返回l1,否则返回l2
}
//l_set设为首元素较小的一个
l_set = (l1->val <= l2->val)?l1:l2;
l_get = (l_set == l1)?l2:l1;
//最终返回首元素较小的链表
l_final = l_set;
while (l_get != 0 && l_set->next != 0)
{
if((l_get->val) <= (l_set->next->val)) {
//记录当前两个指针
l_get_buffer = l_get;
l_set_buffer = l_set;
//next指针更新
l_get = l_get->next;
//指针重组
l_get_buffer->next = l_set_buffer->next;
l_set_buffer->next = l_get_buffer;
}
else
l_set = l_set->next;
}
//有剩余元素未插入
if(l_get != 0)
l_set->next = l_get;
return l_final;
}
注意#
- 插入元素时,被插入链表指针不能后移,否则会漏过被插入链表的一个元素的比较