21. 合并两个有序链表
  Vi5FLT7akNuP 2023年12月06日 29 0


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 ; 
    }

};


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年12月06日 0

暂无评论

推荐阅读
Vi5FLT7akNuP