Leetcode 21合并两个有序链表

Leetcode 21.合并两个有序链表

Problem: 21.合并两个有序链表

个人思路

作为我在leetcode上练手的第一题,我是知道大致思路的:先大小依次遍历所给的两个链表,然后再填入一个大链表中。 有点像数组的做法。但是问题在于,我对于遍历链表以及将其连入另一个链表的操作很陌生。 我不知道什么时候添加指针,应该添加几个指针,所以这道基础题我觉得对于我这个初学者来说还是很有价值的。

Code

/**
 * 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* l1, ListNode* l2) {
        ListNode* l=(ListNode*)malloc(sizeof(ListNode));
        l->next=nullptr;//创立头节点
        ListNode* p=l;//维护一个指针就行

        //遍历两个链表
        while(l1!=nullptr&&l2!=nullptr){
            if(l1->val<l2->val){
                p->next=l1;
                l1=l1->next;
            }
            else{
                p->next=l2;
                l2=l2->next;
            }
            p=p->next;
            }

        //链接未处理完的链表
         if(l2==nullptr){
                p->next=l1;
            }
        else{
                p->next=l2;
        }

        ListNode* result=l->next;
        free(l);
        return result;
    }
};

思考补充

受ds老师启发,突然发现本题好像不需要另外建立一张空表,直接选最小节点当头节点就好了。

    // 确定新链表的头节点
        ListNode* head = nullptr;
        if (l1->val <= l2->val) {
            head = l1;
            l1 = l1->next;
        } else {
            head = l2;
            l2 = l2->next;
        }

后续方法就和上面一样了,链表的操作逻辑和数组还是有很大的不同的。

posted @ 2026-05-25 15:09  why_tree  阅读(12)  评论(0)    收藏  举报