Problem: 21. 合并两个有序链表
文章目录
- 思路
- 1 递归实现
- 2 迭代实现
- Code
思路
方法1 递归实现
方法2 迭代实现
1 递归实现
分析问题
对于本题,合并两个有序链表A和B,mergeTwoLists(A,B),递归只需要关注本层我要干什么?,返回什么?首先我要先直到A,B 哪个链表的头最小,让最小的那个节点指向剩余部分合并的有序链表头,然后返回当前的结点头。
基本情况
- 当A为空的时候,直接返回B,因为这意味着B所有的结点都大于A的所有结点。
- 当B为空的时候,直接返回A,同理。
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 ; }}
};
2 迭代实现
创建一个新的节点preHead ,遍历两个链表,每次让新节点指向两个链表中的最小的一个结点,更新
preHead。
Code
class Solution {
public:ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {// 创建一个新节点ListNode* preHead = new ListNode(-1);ListNode* prev = preHead;while(l1 && l2 ) {if(l1->val <= l2->val ) {prev->next = l1 ; l1 = l1->next ; }else {prev->next = l2 ; l2 = l2->next ; }prev = prev->next ; }if(l1 == nullptr ) {prev->next = l2 ; }else {prev->next = l1 ; }preHead = preHead->next ; return preHead ; }};