力扣对应题目链接:21. 合并两个有序链表 - 力扣(LeetCode)
核心考点:链表合并。
一、《剑指Offer》内容
二、分析题目
这道题的解题思路有很多:
- 可以一个一个节点的归并。
- 可以采用递归完成。
三、代码
1、易于理解的写法
/*** 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) {//不考虑头结点(其实考虑头结点更简单,这里按照难的来)//合并前,先判定if(list1==nullptr) return list2;if(list2==nullptr) return list1;//合并无非是比较各自首节点谁小,就把该节点从原链表中删除,再尾插到新节点处,比较时两个链表任何一个都不能为空ListNode* newHead=nullptr;ListNode* end=nullptr;while(list1 && list2){ListNode* cur=nullptr;//先判定拿那个节点if(list1->val<list2->val) cur=list1;else cur=list2;//再在指定链表中,删除目标节点if(cur==list1) list1=list1->next;else list2=list2->next;//尾插到新链表,这里要考虑第一次插入的情况if(newHead==nullptr){newHead=cur;end=cur;}else{end->next=cur;end=end->next;}}//合并后可能会有几种情况:1.pHead1为空 2.pHead2为空 3.都为空(合并完成)if(list1) end->next=list1;if(list2) end->next=list2;return newHead;}
};
2、递归
//写法一
/*** 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) {if(list1==nullptr) return list2;if(list2==nullptr) return list1;if(list1->val<=list2->val){list1->next=mergeTwoLists(list1->next, list2);return list1;}else{list2->next=mergeTwoLists(list1, list2->next);return list2;}}
};//写法二
/*** 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) {if(list1==nullptr) return list2;if(list2==nullptr) return list1;ListNode* newHead=nullptr;if(list1->val<=list2->val){newHead=list1;list1=list1->next;}else{newHead=list2;list2=list2->next;}newHead->next=mergeTwoLists(list1, list2);return newHead;}
};