合并两个有序链表

合并两个有序链表

描述

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

示例:

输入: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;
}

注意

  • 插入元素时,被插入链表指针不能后移,否则会漏过被插入链表的一个元素的比较
原文地址:https://www.cnblogs.com/ekkone/p/11667172.html