跳至主要內容

leetcode 21. 合并两个有序链表

张威大约 1 分钟数据结构与算法链表虚拟头结点双指针

21. 合并两个有序链表open in new window

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

注意:读清题意,不是用新的链表

/**
 * 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 *dummyHead = new ListNode(-1);
        ListNode *res = dummyHead;
        ListNode *p1 = list1;
        ListNode *p2 = list2;
        while(p1 != nullptr && p2 != nullptr) {
            // ListNode* newNode = nullptr;
            if(p1->val < p2->val) {
                //newNode = new ListNode(p1->val,nullptr);
                res->next = p1;
                p1 = p1->next;	//记得让p1往前走一位
            }
            else {
                // newNode = new ListNode(p2->val, nullptr);
                res->next = p2;
                p2 = p2->next;
            }
            res = res->next;//让新链表的指针往前走一位
            // res->next = newNode;
            // res = res->next;
        } 
        if(p1 != nullptr) {	//if判断哪个还有剩,不需要while遍历后面的所有的结点
            // ListNode* newNode = new ListNode(p1->val);
            // res->next = newNode;
            // res = res->next;
            res->next = p1;
        }
        if(p2 != nullptr) {
            // ListNode* newNode = new ListNode(p2->val);
            // res->next = newNode;
            // res = res->next;
            res->next = p2;
        }
        ListNode* head = dummyHead->next;
        delete dummyHead;
        dummyHead = nullptr;
        return head;
    }
};