Merge Two Sorted Lists - Leetcode

26 篇文章 0 订阅

题意:合并两个有序链表。
思路:此题难易程度是easy,在数据结构书中讲链表这一块有这个题目出现。做法很简单,分别用指针指向两个链表,比较指针所指的值大小,将值小的那一项放入新链表中,并将该指针向后移动一位。
笔者第一次提交的代码如下。这段代码是有问题的,他用r指针确实按从小到大的顺序遍历的两个链表的元素,head也确实是所谓新链表的头指针的内容。但这里最大的问题是并没有生成完整的链表!head的next指针是NULL,r也只是按从小到大顺序,依次是当前的节点(val,NULL)。但是并没有将每个节点串连起来!这是一个严重的问题。然而这个错误出现之后,笔者并没有弄清状况,仍然不知道代码哪里的错误导致了这样的结果。可见笔者对指针这一块内容理解的过于肤浅了。随后在网上看了一下其他人按照这种做法编写的代码,比照了,然后找出来问题出在哪里。

ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
     ListNode* head=NULL;
    ListNode* r=NULL;
    if (l1 == NULL&&l2 == NULL) return NULL;
    if (l1 != NULL&&l2 == NULL) return l1;
    if (l1 == NULL&&l2 != NULL) return l2;
    if (l1->val<l2->val) {
        head=new ListNode(l1->val);
        l1 = l1->next;
    }
    else {
        head = new ListNode(l2->val);
        l2 = l2->next;
    }
    //错误。应该是r=head;
    head= r;
    while (l1 != NULL&&l2 != NULL) {
        if (l1->val<l2->val) {
        //错误。如果这里重新new一个结点的话,那么r就指向了一个新地址
        //因此这样就不能形成一个完整的链表了。
            r = new ListNode(l1->val);
            l1 = l1->next;
            r = r->next;
        }
        else {
            r = new ListNode(l2->val);
            l2 = l2->next;
            r = r->next;
        }
    }
    if (l1 != NULL&&l2 == NULL)
    {
        r = l1;
    }
    else if (l1 == NULL&&l2 != NULL)
    {
        r = l2;
    }
    return head;
    }

修改之后的代码如下。这样就AC了。

 ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
    ListNode* head=NULL;
    ListNode* r=NULL;
    if (l1 == NULL&&l2 == NULL) return NULL;
    if (l1 != NULL&&l2 == NULL) return l1;
    if (l1 == NULL&&l2 != NULL) return l2;
    if (l1->val<l2->val) {
        head=new ListNode(l1->val);
        l1 = l1->next;
    }
    else {
        head = new ListNode(l2->val);
        l2 = l2->next;
    }
    r = head;
    while (l1 != NULL&&l2 != NULL) {
        if (l1->val<l2->val) {
            r->next = l1;
            l1 = l1->next;
            r = r->next;
        }
        else {
            r->next = l2;
            l2 = l2->next;
            r = r->next;
        }
    }
    if (l2 == NULL)
    {
        r->next=l1;
    }
    else if (l1 == NULL)
    {
        r->next=l2;
    }
    return head;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值