merge two sort list-leetcode 有序链表合并的二级指针简洁非递归解法

【注,本方法并没有在效率上优于同类非递归解法,只是统一了部分逻辑,增加了代码的简洁】

记得当初上c++课的时候,Mr.Lu提到过,链表里因为头指针是指针而非节点的缘故,因此在很多时候处理链表时需要写不同的代码处理头指针Node*和后续的Node。但是当引入二级指针之后,很多逻辑又能统一。因为一般对指针进行重绑定的时候是在Node结构体中的Node*中,这跟头指针是一致的。


合并两个有序链表的时候,要么递归,要么非递归。递归的代码看起来少,但是每有一个节点便递归一次,效率就不谈了。。

而非递归的一般做法

1.先进行指针判空

2.当两者都不为空的时候,选择其中一个链表,将其中的元素插入结果链表,直到一张链表为空

3.最后将另一张非空链表中的元素全部加到目标链表中(这一步倒是简单,一句话就可以写完)


因此代码并会显得挺长。

可以看出,上述的操作里有共同的部分:将某一个链表的第一个元素取下,加到新链表中。 这时候c/c++提供指针的好处就体现出来了。【多说句,指针这些概念我觉得就是方便了抽象,站在一个更高的层面去处理一系列操作。比如int指针可以操纵多个int变量,只要你绑定好了。】同样,由于链表是用一级指针表示,那么我们可以用更高一级的二级指针去操作一系列的链表,完成公共操作的副本。


因此以下代码使用cur指针统一了头指针与节点的操作;用min指针统一了非递归做法的2、3两步操作。

ListNode *mergeTwoLists(ListNode *h1, ListNode *h2) {
        ListNode *head=NULL,**cur=&head,**min;
        while(h1||h2){
            min=!h2||h1&&h1->val<h2->val ? &h1:&h2;
            *cur=*min;				//insert to the ans list;
            cur=&(*cur)->next;		//update the next insert position
            *min=(*min)->next;		//min pointer move 
        }
        return head;
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值