合并两个排序链表

这篇博客介绍了如何将两个已排序的链表合并成一个新的有序链表。作者最初尝试仅使用一个指针进行合并,但遇到错误,后来发现需要维护两个指针,一个用于插入操作,另一个始终指向链表头部。通过使用Visual Studio的断点调试,问题得以解决。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

描述

将两个排序链表合并为一个新的排序链表

样例

给出 1->3->8->11->15->null,2->null, 返回 1->2->3->8->11->15->null

思考

  1. 因为之前没有做过这种题目,所以一开始只设置了一个指针来对两个列表中的最小值进行插入,发现总是跑到 7% 的时候就出错,应该只有空集通过了测试数据。
  2. 实际上随着链表元素的插入,指针也在向后移,而函数需要的是整个链表的指针,而不是随着元素插入指向最后一个元素的指针
  3. 所以需要设置两个指针,一个执行插入操作,一个指向头结点
  4. 提一句,VS 的断点还是很有用的,不然得折腾我几个小时了

代码

//  By Lentitude


/**
 * Definition of ListNode
 * class ListNode {
 * public:
 *     int val;
 *     ListNode *next;
 *     ListNode(int val) {
 *         this->val = val;
 *         this->next = NULL;
 *     }
 * }
 */
class Solution {
 public:
    /**
     * @param ListNode l1 is the head of the linked list
     * @param ListNode l2 is the head of the linked list
     * @return: ListNode head of linked list
     */
    ListNode *mergeTwoLists(ListNode *l1, ListNode *l2) {
        // write your code here

        if(l1 == NULL) return l2;   //如果有一个是空表
        if(l2 == NULL) return l1;

        ListNode *l3 = NULL, *p = NULL;
         while(l1 != NULL && l2 != NULL){
             if(l1->val < l2->val){
                 if(l3==NULL){
                     l3 = new ListNode(l1->val);
                     // 很重要, 因为需要返回一个链表的指针
                     p = l3;
                 } else {
                     l3->next = new ListNode(l1->val);
                     l3 = l3->next;
                 }
                 l1 = l1->next;
             } else {
                 if(l3==NULL){
                     l3 = new ListNode(l2->val);
                     p=l3;
                 } else {
                     l3->next = new ListNode(l2->val);
                     l3 = l3->next;
                 }
                 l2 = l2->next;
             }
         }

         if(l1 != NULL) l3->next = l1;
         if(l2 != NULL) l3->next = l2;
         return p;
     }
 };
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值