一道合并有序链表的题

 

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {
       ListNode* prehead=new ListNode(-1);//哨兵
       ListNode* temp=prehead;
    //    当链表都不为空才是进入循环的条件
       while(list1!=nullptr&&list2!=nullptr){
           if(list1->val<list2->val){
               temp->next=list1;
               list1=list1->next;
           }
           else{
               temp->next=list2;
               list2=list2->next;
           }
           temp=temp->next;
       }
       temp->next=list1==nullptr?list2:list1;
       return prehead->next;
    }
};
未想到短短几月,在接触同一道题,还收获许多知识与感悟!
ps:我是个编码小垃圾,大佬路过别喷~
将两个链表合并成一个链表,
1.首先我们建立一个哨兵prehead,方便返回合并链表l3的头指针。在建立连接链表的一个指针temp,若l1中val小于l2中val,temp中next将存储l1的结点的地址,l1遍历到它的下一个结点。否则,反。这时我们完成了一次比较,将temp->next赋值给temp。进入下次循环的比较

 2.当我们退出循环时,L1,L2其中为空间链表。我们可以直接将非空链表插入到L3中尾指针后面,最后将L3的头指针返回,也就是之前提到的prehead的next.

posted @ 2023-01-18 20:02  很cool一阵风  阅读(20)  评论(0)    收藏  举报